【问题标题】:Why would you use an immutable value in a dictionary?为什么要在字典中使用不可变值?
【发布时间】:2013-03-21 22:26:18
【问题描述】:

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

接受的Jon Skeet's answer 提出了一个具有只读属性的类Pair@teedyay's answer 以使用不可变的Tuple

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

附带问题:
为什么 to make TFirst and TSecond readonly 如果各自的属性 First 和 Second 无论如何都没有设置器:

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 查询的一些好处 (?)
如果是这样,你能给我举个例子,我想念什么吗?

【问题讨论】:

  • First 可能没有设置器,但如果它不是只读的,则不会限制您直接设置。
  • 至于 teedyay 的回答,Tuple 的不变性可能是偶然的,Tuple 只是将两个值配对在一起的最简单方法。可能是 Jon Skeet 的回答也是偶然的,因为他发布了他为另一个场合编写的 Pair 类型的代码。
  • 我同意@DanielFischer 的观点,我只是认为这是对话的偶然性,尤其是当他的实现提供了对GetHashCode 的覆盖时。有关于在可变类型上覆盖 GetHashCode 的警告。

标签: c# .net linq collections dictionary


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    顺便说一句,这门课似乎是struct 的可靠候选人。

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 1970-01-01
      • 2015-03-16
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2013-01-26
      • 2016-01-15
      相关资源
      最近更新 更多