1

オブジェクトを辞書に入れた場合、それはポインタになるか?

私は次の辞書を持っています:

public Dictionary<string, Class1> Dic{ get; set; }

次の関数では、辞書を更新/追加します

    private void Update(string Name)
    {
        if (Name== null || Name=="")
            return;
        if (Dic.ContainsKey(Name))
        {
            Dic[Name] = MyClass;
        }
        else
        {
            Dic.Add(Name, MyClass);
        }
    }

MyClass は、辞書と同じクラスにある変数です

public Class1 MyClass { get; set; }

私が呼び出すクラスを更新関数に変更すると、すべての辞書が同じ値を含むことがわかります: current MyClass 、なぜですか?

どうすればこれを防ぐことができますか?

4

5 に答える 5

2

ディクショナリ内の複数のキーに対して同じクラス オブジェクトを追加していますが、それらはすべて同じオブジェクトを指しているため、1 つのオブジェクトを変更すると、ディクショナリ全体の変更が表示されます。クラス オブジェクトのコピーを作成し、辞書に追加する必要があります。

次のディスカッションが表示される場合があります: How do you do a deep copy an object in .Net (特に C#)? スタックオーバーフローで。

それ以外は、キーが存在しないかどうかを確認し、そうでない場合は更新するため、キーに対するチェックを取り除くことができます。あなたは簡単に行うことができます:

private void Update(string Name)
    {
        if (Name== null || Name=="")
            return;
        Dic[Name] = MyClass;
    }

同じことを行います(存在しない場合は追加し、存在する場合は更新します)

于 2013-03-07T10:30:08.443 に答える
1

あなたが入れたクラスは参照によるものなので、どこかを変更すると、そこも「変更」されます(実際にはそこでは変更されず、1か所だけが変更されますが、私たちは皆同じものを見ています、 いわば)。したがって、実際には辞書とは関係なく、.NET の仕組みとは関係ありません。

整数などの値の型を入力してから変数の値を変更した場合、そのような変更は反映されません。状況に応じて値型である構造を定義でき、「変更のカスケード」なしで型を「再利用」できます。

于 2013-03-07T10:28:02.313 に答える
1

いいえ、そうです。「オブジェクトをディクショナリに入れる」ことは決してありません。実際には、オブジェクトへの参照をディクショナリに入れます。参照は元のオブジェクトを指しています: オブジェクトは複製されていません。

の場合Class1structアクセスまたは挿入するたびに実際にコピーされます。

人間の言葉で言えば、参照は家への書面による住所です。多くの人がそのアドレスのコピーを持つことができます。誰かが家に行ってドアを赤く塗ったら、その住所を見た人は誰でもそれを見ます。

(ジョンからこの類推を盗んだと思います。申し訳ありませんジョン)

のようなことをしているようです。

MyClass obj = new MyClass();
foreach(var name in names) {
    obj.Update(name);
}

あなたがしなければならないとき:

foreach(var name in names) {
    MyClass obj = new MyClass();
    obj.Update(name);
}

ここでの違いは、オブジェクトの数です。

于 2013-03-07T10:28:42.087 に答える
0

クラスは参照型であるため、Dictionary にはそのメモリ リンクが含まれています。実際には、参照型値型でさらに確認できます

于 2013-03-07T10:30:42.613 に答える
0

クラスは参照型だからです。つまり、その型のすべての変数はその型へのポインターです。

于 2013-03-07T10:28:41.537 に答える