如何修改列表属性而不影响其他相同类型的列表属性

本文关键字:列表 属性 其他 影响 同类型 修改 何修改 | 更新日期: 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#中引用类型和值类型的区别是什么?