如何修改列表属性而不影响其他相同类型的列表属性
本文关键字:列表 属性 其他 影响 同类型 修改 何修改 | 更新日期: 2023-09-27 17:54:43
下面是我的示例代码,
List<myClass> myclass1 = new List<myClass>();
List<myClass> myclass2 = new List<myClass>();
//add data to myClass1 from source
foreach (myClass data in source)
myclass1.Add(data);
//add data to myClass2 from source
foreach (myClass data in source)
myclass2.Add(data);
//Change name property only for myclass1
foreach (myClass data in myclass1)
data.Name = "Test";
修改myclass1
对象的name属性后,也将myclass2
对象的name属性的值修改为"Test"。原因是什么?我该如何避免呢?
这是因为您在两个列表中放入了相同的内容!
如果你希望每个列表的内容不同,那么就不要在其中放入相同的内容。
如果myClass
实现了IClonable
,那么您可以使用
foreach (myClass data in source)
myclass1.Add((myClass)data.Clone());
这是因为你使用引用类型,这意味着你只把实例的引用放到列表中,所以基本上你必须列出包含相同元素的列表。您可以使用值类型,但如果它有引用类型字段,它仍然会引用其中相同的对象实例。您可以尝试克隆或序列化和反序列化对象,但之后列表将不包含源元素,只包含它们的副本。
这是因为data
在两个列表中是相同的。
要做到这一点,你需要把不同的数据放在第二个列表中,如下所示:-
var source2 = source.clone();
foreach (myClass data in source2 )
myclass2.Add(data);
List通过引用存储,创建临时对象并添加到列表中。
foreach(myClass data in source)
{
myClass tmpData = new myClass(){
Something = data.Something;
};
myClass1.Add(tmpData);
}
myClass
为引用类型。为了解决这个问题,您应该在第二个列表中添加data
的副本。
了解值类型和引用类型的区别以及它们在c#中的工作原理。
检查一下:c#中引用类型和值类型的区别是什么?