使用lambda表达式时,列表中的属性已更改
本文关键字:属性 列表 lambda 表达式 使用 | 更新日期: 2023-09-27 18:16:44
我不知道为什么列表中的项目在使用lambda表达式时发生了变化。这里是我的代码
using System;
using System.Collections.Generic;
using System.Linq;
public class test
{
public string id { get; set; }
public string name { get; set; }
public string no { get; set; }
}
public class Program
{
public static List<test> a;
public static List<test> b = new List<test>();
public static List<test> a_list()
{
List<test> c = new List<test>();
c.Add(new test() { id = "_01", name=null, no="1"});
c.Add(new test() { id = "_02", name=null, no="2"});
return c;
}
public static void Main()
{
a = a_list();
string key = "_01";
//
test i = new test();
i = a.First(x => x.id.Equals(key));
i.name = "xxxxxxx";
b.Add(i);
//
Console.WriteLine("id:"+a[0].id+"'nName:"+a[0].name+"'nno:"+a[0].no);
Console.WriteLine("id:"+b[0].id+"'nName:"+b[0].name+"'nno:"+b[0].no);
Console.ReadLine();
}
}
这是结果id: _01名称:xxxxxxx没有:1id: _01名称:xxxxxxx没有:1
为什么a[0]等于"xxxxxxx"?(对不起,我的英语不好)
这里:
i = a.First(x => x.id.Equals(key));
i.name = "xxxxxxx";
i
和a.First()
现在是对同一个对象的引用。修改该对象的属性会影响到这两个对象,因为它们是指向同一对象的指针。
基本上你的代码做的是:
- 创建一个包含两个元素的列表(
a
) - 获取它的第一个元素并修改该元素的值
- 将该元素添加到第二个列表(
b
)
所以结果是你有两个列表-一个(a
)包含两个元素,另一个(b
)只有一个,但是(这里是重要的一点)-它与a
中的第一个元素完全相同。因此,当您写入两个列表的第一个元素时,结果是相等的。
想象你有一个摄像头正对着一辆汽车。当车门打开时,你通过摄像头看到车门,但摄像头不是车。
现在你的朋友在远处也把他的相机对准了汽车。你们都能看到门开关门,还有灯等等。
变量就像照相机,汽车是它指向的对象。如果你关掉或毁掉其中一个摄像头,车还在那里。事实上,如果你破坏了两个摄像头,汽车仍然在那里(直到垃圾收集)。
查看这篇优秀的文章:http://codebetter.com/karlseguin/2008/04/28/foundations-of-programming-pt-7-back-to-basics-memory/