为什么即使我没有使用引用,我的类型List <Point>的变量也会被更改?

 阿里根本_436 发布于 2023-02-08 14:14

我有一个叫做temp类型的变量List.出于某种原因,当我打电话时sanitize(temp),变量temp似乎发生了变化.我知道变量会temp发生变化,因为C:\out.bmp如果我包含该sanitize(temp)行,我输出的输出会有所不同.我从消息框得到的输出是"临时没有改变".

List 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 sanitize(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;
}

这让我疯了.

1 个回答
  • 当你这样做时:

    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.");
    }
    

    2023-02-08 14:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有