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

コピーした辞書を変更しても元の辞書は変更されないことを期待していましたが、私のコードではそうではありません。

私は何を間違っていますか?

4

1 に答える 1

3

Corak が言うように、浅いコピーを作成しました。オブジェクト自体ではなく、メモリ内のオブジェクトへの参照をコピーしています。これで、キーごとに、1 つのオブジェクトへの 2 つの参照ができました。

必要なのはディープ コピーです。ここを参照してください: What is the best way to clone/deep copy a .NET generic Dictionary<string, T>?

于 2013-04-11T10:18:42.713 に答える