5

问题“多值字典”的多个答案建议使用不可变的类,如TValueClass Dictionary<TKey, TValue>

接受的 Jon Skeet 的答案提出了一个Pair具有只读属性的类和@teedyay 的使用不可变的答案Tuple

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

和附带问题:如果各自的属性 First 和 Second 无论如何都没有设置器,
为什么要使 TFirst 和 TSecond 只读:

private readonly TFirst first;
private readonly TSecond second;

public TFirst First
{
   get { return first; }
}

public TSecond Second
{
   get { return second; }
}

更新:
我正在使用带有自定义类的字典来获取其中的值。
并且值正在更新。
我使它们不可变的可能原因(好处)是什么?

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

4

2 回答 2

4

基本上,根据我的经验,不变性使各种事情更容易阅读。例如,JavaCalendarDate类的一大痛点是它们的可变性。很容易忘记它们是可变的,在构造函数中获取引用的副本,然后发现其他东西会改变您引用的对象。因此,即使没有任何东西会改变对象,您也开始采取防御性副本……这一切都变得非常烦人。

当然,可变性是有时间的——但在许多情况下,不变性更好。

于 2013-03-31T21:21:36.747 回答
1

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

顺便说一句,这门课似乎是struct.

于 2013-03-31T19:22:17.160 回答