2013-04-11 4 views
2

Это противоречит тому, что, как я думал, я понял о копировании Словаря. Скажем, у меня есть следующий код:Неожиданные результаты копирования Словаря

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 

Я ожидал, что изменение скопированного словаря я не изменил бы оригинал, но это не так с моим кодом.

Что я делаю неправильно?

+2

Google намек: 'неглубокие copy' в сравнении' глубокой copy'. Вы копируете ссылки, а не фактические объекты. – Corak

+0

Вы можете прочитать статью Джона Скита о [параметрировании прохождения] (http://www.yoda.arachsys.com/csharp/parameters.html), что также объясняет ссылки. – Default

+0

@Default: Я просто хочу, чтобы это было лучше документировано. Я начал использовать этот метод после поиска «Словарь для копирования C#», считая, что весь мой словарь скопирован. – c00000fd

ответ

3

Как говорит Корак, вы сделали мелкую копию. Вы копируете ссылки на объекты в памяти, а не на объекты. Теперь для каждого ключа у вас есть две ссылки на один объект.

То, что вы хотите, это глубокая копия, смотрите здесь: What is the best way to clone/deep copy a .NET generic Dictionary<string, T>?

+0

Спасибо. Хотя это несколько запутанно. Очевидно, словари могут быть вложенными, так что, если я делаю «мелкую копию» в родительском словаре, когда «вложенный» словарь выполняет «глубокую копию»? – c00000fd

+0

Словари просто сопоставляют ключи со значениями. Значения - это ссылки, а не объекты, это только то, как работает C#. Ценностями могут быть структуры, и в этом случае они могут вести себя по-другому (хотя это были годы, я немного туман). – Joe

+0

Что касается вложенных словарей, я думаю, вы должны реализовать свои собственные методы копирования. – Joe

Смежные вопросы