在c#

时间:2017-08-02 07:56:43

标签: c# deep-copy reference-type

我有两个列表,我正在尝试将源复制到目标。在新的迭代中,更改源会影响目标。我明白了,我正在制作参考副本。有没有办法在不使用任何序列化程序的情况下进行深层复制(由于性能问题)。请在下面找到我的代码

public void ListFiller()
      {
         newListCopy = new List<KeyValuePair<string, object>>(newList);             
      } 

1 个答案:

答案 0 :(得分:1)

KeyValuePair是结构,因此将被重新创建。但是,不会重新创建KeyValuePair的值,因为它们是引用类型。因此,在两个数据结构中仍然引用相同的实例。

要解决的高效方法是实现IClonable(或自定义克隆方法)并手动创建对象的深层克隆。但是,这非常耗时,如果对象结构发生更改,则必须维护克隆方法:

  public void ListFiller()
  {
     newListCopy = new List<KeyValuePair<string, object>>();
     foreach (var pair in newList)
     {
         var clone = (pair.Value as IClonable)?.Clone();
         // handle case that the object does not implement IClonable
         newListCopy.Add(new KeyValuePair<string, object>(pair.Key, clone );
     }           
  } 

正如您已经提到的,更简单的方法是,使用序列化来重新创建整个数据结构。这是相对容易实现但不是那么高效(实际上是一个问题?)并且对象需要可序列化。

互联网上充满了similar questions and solutions