【发布时间】: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 copy与deep copy。您正在复制引用,而不是实际对象。 -
您可以阅读 Jon Skeets 关于 parameter passing 的文章,其中也解释了参考资料。
-
@Default:我只是希望它有更好的文档记录。我在搜索“C# 复制字典”后开始使用此方法,认为我的整个字典都被复制了。
-
好吧,我不确定你读到了什么 :) 对我来说,复制引用是很自然的,但我来自一个编程背景,而你来自另一个。也许那些编写您阅读的文档的人认为读者知道引用是作为引用复制的。
标签: c# .net dictionary