为什么要在字典中使用不可变值?

时间:2013-03-31 19:11:51

标签: c# .net linq collections dictionary

问题“Multi value Dictionary”的多个答案建议在Dictionary<TKey, TValue>类中使用不可变类作为TValue

已接受的Jon Skeet's answer建议使用只读属性的类Pair@teedyay's answer来使用不可变Tuple

此类方法的基本原理(或可能的好处)是什么?

和抵押问题:
为什么to make TFirst and TSecond readonly如果相应的属性First和Second仍然没有setter:

private readonly TFirst first;
private readonly TSecond second;

public TFirst First
{
   get { return first; }
}

public TSecond Second
{
   get { return second; }
}

更新
我正在使用带有自定义类的字典来表示其中的值 并且va lues正在更新 让我们变成一成不变的可能原因(好处)是什么?

我看到Lookup<TKey, TElement> Class也是不可变的,并且认为我错过了使用LINQ查询的一些好处(?)
如果是这样,你能举例说明我错过了什么吗?

2 个答案:

答案 0 :(得分:4)

基本上,不变性使我在经验中更容易理解各种事物。例如,Java的CalendarDate类中的一个重点是它们的可变性。这很容易忘记他们是可变的,在构造函数中复制一个引用,然后发现其他东西会改变你已经拥有的对象参考。因此,即使 没有任何东西要改变对象,你也会开始采取防御性副本......这一切都变得非常烦人。

当然,还有可变性的时间 - 但在很多情况下,不变性就更好了。

答案 1 :(得分:1)

第二个问题的答案是成员变量仍然可以在没有readonly关键字的情况下进行设置 - 仅在类本身内,但仍然可以。

顺便说一句,这个类似乎是struct的坚实候选者。