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>();

将 0 放入 TestCase 并将条目添加到字典中:

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

现在字典看起来像这样: {TestCase -> Value=0:10} 现在这样做:

TestCase.Value=1

现在我自动在字典 {TestCase -> Value=1 : 10} 中,而无需将键 'TestCase -> Value=1' 放入字典中。我怎样才能避免它?

4

3 回答 3

4

基本上,不要使用可变类型作为键......或者如果你这样做,请确保你永远不会改变键。第一个会更好。

一个更大的问题是,如果TestClass<Val>有一个自定义GetHashCode()/Equals()实现,你可以完全破坏字典,因为它可能不再能够找到那个键的值,即使你给它你开始使用的确切实例

理想情况下,您用作密钥的任何内容都应该是不可变的。出于这个原因,intstring做出很好的选择,但您也可以按照@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 回答