1

単純なクラスを考えてみましょう。

public class TestClass<Val>
{
    public Val Value{get;set;}
}

このクラスのインスタンスを作成し、それをキーとして使用する辞書を定義します。

TestClass<int> TestCase = new TestClass<int>();
Dictionary<TestClass<int>, int> D = new Dictionary<TestClass<int>, int>();

TestCaseに0を入力し、辞書にエントリを追加します。

TestCase.Value=0
D.Add(TestCase,10)

これで、ディクショナリは次のようになります。{TestCase-> Value = 0:10}次に、次のようにします。

TestCase.Value=1

これで、キー'TestCase-> Value = 1'を辞書に入れずに、辞書に{TestCase-> Value = 1:10}が自動的に追加されました。どうすればそれを回避できますか?

4

3 に答える 3

4

基本的に、キーとして変更可能なタイプを使用しないでください...または使用する場合は、キーを変更しないようにしてください。最初のものが望ましいでしょう。

さらに大きな問題はTestClass<Val>、カスタムGetHashCode()/実装がある場合、最初に使用した正確なインスタンスを指定してもEquals()、そのキーの値を見つけることができなくなる可能性があるため、辞書を完全に壊す可能性があることです。

キーとして使用するものはすべて、理想的には不変である必要があります。そのため、intそしてstring素晴らしい選択をしますが、@ lazyberezovskyの例のように、タイプを不変にすることもできます。

于 2012-10-31T10:31:49.903 に答える
2

実際には、TestClassの単一のインスタンスがあります。辞書の外で作成し、そのインスタンスを辞書に追加しました。

インスタンスに変更を加えると、辞書内に反映されます。これは浅いコピーです

この問題を回避するには、インスタンスのディープクローンを作成してから、辞書に追加します。その場合、一方の変更はもう一方には反映されません。

于 2012-10-31T10:31:15.800 に答える
2

不変TestCaseクラスを作成します。

public class TestClass<Val>
{
    public TestClass(Val value)
    {
       Value = value;
    }

    public Val Value{ get; private set; }
}
于 2012-10-31T10:32:04.900 に答える