【问题标题】:Unexpected results of copying a Dictionary [duplicate]复制字典的意外结果[重复]
【发布时间】:2013-04-03 11:53:07
【问题描述】:

这与我对复制字典的理解背道而驰。说,我有以下代码:

public class MyClass
{
    public string str1;

    public MyClass(string s)
    {
        str1 = s;
    }
}

Dictionary<string, MyClass> dic1 = new Dictionary<string, MyClass>();
dic1.Add("0", new MyClass("hello"));

//Make 'dic2' as a copy of 'dic1'
Dictionary<string, MyClass> dic2 = new Dictionary<string, MyClass>(dic1);

//Alter 'dic1'
dic1.ElementAt(0).Value.str1 += "!!!";

//I was expecting dic2 not to be altered, but IT IS!
Debug.Assert(dic2["0"].str1.Equals(dic1["0"].str1, StringComparison.Ordinal) == false);     //Result is true for equality

我原以为更改复制的字典不会更改原始字典,但我的代码并非如此。

我做错了什么?

【问题讨论】:

  • Google 提示:shallow copydeep copy。您正在复制引用,而不是实际对象。
  • 您可以阅读 Jon Skeets 关于 parameter passing 的文章,其中也解释了参考资料。
  • @Default:我只是希望它有更好的文档记录。我在搜索“C# 复制字典”后开始使用此方法,认为我的整个字典都被复制了。
  • 好吧,我不确定你读到了什么 :) 对我来说,复制引用是很自然的,但我来自一个编程背景,而你来自另一个。也许那些编写您阅读的文档的人认为读者知道引用是作为引用复制的。

标签: c# .net dictionary


【解决方案1】:

正如 Corak 所说,你做了一个浅拷贝。您正在复制对内存中对象的引用,而不是对象本身。现在,对于每个键,您有两个对一个对象的引用。

你想要的是一个深拷贝,看这里:What is the best way to clone/deep copy a .NET generic Dictionary<string, T>?

【讨论】:

  • 谢谢。虽然有点混乱。明明字典是可以嵌套的,那如果我在“嵌套”字典做“深拷贝”的时候对父字典做“浅拷贝”呢?
  • 字典只是将键映射到值。这些值是引用而不是对象,这正是 C# 的工作方式。这些值可能是结构,在这种情况下,它们的行为可能会有所不同(尽管已经有好几年了,我有点模糊)。
  • 对于嵌套字典,我认为你必须实现自己的复制方法。
  • 是的,我必须自己做,因为在我的情况下,您链接到的代码示例不适用于我自己的类。
  • 很抱歉,实施对您不起作用。但是,如果您正在实现自己的类并以这种方式使用它们,那么您有责任实现克隆功能。祝你好运!
猜你喜欢
  • 2013-02-19
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 2017-10-04
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
相关资源
最近更新 更多