我有一个叫做temp
类型的变量List
.出于某种原因,当我打电话时sanitize(temp)
,变量temp
似乎发生了变化.我知道变量会temp
发生变化,因为C:\out.bmp
如果我包含该sanitize(temp)
行,我输出的输出会有所不同.我从消息框得到的输出是"临时没有改变".
Listoriginal = temp; sanitize(temp); if (temp.Equals(original)) { MessageBox.Show(@"temp was not changed."); } else { MessageBox.Show(@"temp was changed."); } outputPointsOnBitmap(temp.ToArray(), ref windowBitmap, Color.Yellow); windowBitmap.Save("C:\\out.bmp");
对于好奇,这里有更多的源代码:
private void outputPointsOnBitmap(Point[] points, ref Bitmap bitmap, Color markerColor) { foreach (Point point in points) { bitmap.SetPixel(point.X, point.Y, markerColor); } } private Listsanitize(List crossPoints) { SortedSet indexesToDelete = new SortedSet (); for (int i = 0; i < crossPoints.Count() - 1; i++) { if (Math.Abs(crossPoints[i + 1].X - crossPoints[i].X) <= 5 && Math.Abs(crossPoints[i + 1].Y - crossPoints[i].Y) <= 5) { indexesToDelete.Add(i); indexesToDelete.Add(i + 1); } } foreach (int i in indexesToDelete.Reverse()) { crossPoints.RemoveAt(i); } return crossPoints; }
这让我疯了.
当你这样做时:
List<Point> original = temp;
您使变量original
引用引用的列表temp
.
这样任何改变sanitize
使得以temp
在也可见original
.temp.Equals(original)
返回true,因为它们是同一个对象.如果您想original
成为具有相同项目的新列表temp
,请构造一个新List
对象:
List<Point> original = new List<Point>(temp);
你说你没有使用引用,但它List<T>
是一个引用类型,因为它不会继承ValueType
- 当你分配或传递它时,你总是使用引用.
以下是.Net中值和引用类型之间差异的一个很好的细分:http: //www.albahari.com/valuevsreftypes.aspx
正如Jordy Langen指出的那样,temp.Equals(original)
现在总是会返回false,因为这两个列表是不同的对象(这就是Object.Equals
参考类型的内容).如果要查看该sanitize
功能是否完全更改了列表,您可以使用Enumerable.SequenceEqual
:
if (temp.SequenceEqual(original)) { MessageBox.Show(@"temp was not changed."); } else { MessageBox.Show(@"temp was changed."); }