【问题标题】:What does List.Add(List[index]) creates a new object or a reference?List.Add(List[index]) 创建一个新对象或引用是什么?
【发布时间】:2013-06-30 17:38:26
【问题描述】:

好的,我有一个List<string[][]> myList 用于存储一组复杂的字符串。 每次需要新的分支时,我都需要将列表的所有元素添加到自身。

这就是我现在正在做的事情

 for (int k = 0; k < (count); k++)
 {
     myList.Add(myList[k]);
 }

但是当我通过 List[index].SetValue(value, index) 修改列表元素之一时 列表中该索引处的所有列表元素都会更改!

知道为什么吗?我猜这是因为myList.Add(myList[k]) 正在创建一个引用,所以基本上,我如何将它创建为一个新对象?

【问题讨论】:

  • 取决于 myList 的类型。
  • 抱歉,myList 是一个简单的List&lt;string[][]&gt;
  • 添加对象的克隆而不是对列表的引用。
  • 好的,我看到有一个与List 关联的MemberwiseClone() 函数。它说它创建了一个浅拷贝。维基百科对 shallowcopy 的定义如下:复制对象的一种方法是shallow copy。在浅拷贝A的过程中,B会拷贝A的所有字段值。如果字段值是内存地址,则复制内存地址,如果字段值是原始类型,则复制原始类型的值。 缺点是如果你修改了 B 的一个字段指向的内存地址,你也在修改 A 的字段指向的内容
  • 好吧,我想这正是我的方法所做的。因此,任何更改都会通过...传播...是否有其他克隆方法可以执行deep copy?

标签: c# list object reference mutation


【解决方案1】:

所以这就是我最终要做的......如果你知道一个更好的方法,请提出一个更好的方法。

for (int k = 0; k < (count); k++)
 {
     myList.Add((string[][])myList[k].Clone());
 }

还有其他方法可以做到这一点吗?无需遍历每个列表成员?

【讨论】:

  • Clone 对二维数组的复制太浅了。您需要编写自己的克隆方法来创建一个新数组并将各个字符串复制到其中。或者克隆第二维中的每个一维数组。或者使用一维数组开始。
猜你喜欢
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多