gpt4 book ai didi

c# - 为什么我的类型 List 的变量被更改,即使我没有使用引用?

转载 作者:太空宇宙 更新时间:2023-11-03 17:24:49 25 4
gpt4 key购买 nike

我有一个名为 temp 的变量这是类型 List<Point> .出于某种原因,当我调用 sanitize(temp) , 变量 temp似乎改变了。我知道变量 temp变化,因为我在 C:\out.bmp 上得到的输出如果我包含 sanitize(temp) 则不同行与否。我从消息框得到的输出是“temp was not changed.”

List<Point> original = 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 List<Point> sanitize(List<Point> crossPoints) {
SortedSet<int> indexesToDelete = new SortedSet<int>();

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使 temporiginal 中也可见. 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.");
}

关于c# - 为什么我的类型 List<Point> 的变量被更改,即使我没有使用引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20747409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com