ReadOnlyDictionary和ImmutableDictionary之间的区别是什么?

时间:2017-10-24 12:57:06

标签: c# .net immutable-collections

在C#中,这两个容器之间的关键区别(在功能或用例方面)是什么?似乎没有任何信息可以在Google上比较这些信息。

System.Collections.ObjectModel.ReadOnlyDictionary System.Collections.Immutable.ImmutableDictionary

我知道ImmutableDictionary是线程安全的。 ReadOnlyDictionary也是如此吗?

3 个答案:

答案 0 :(得分:22)

  • ReadOnlyDictionary可以通过构造函数初始化一次,然后就无法添加或删除项目(它们抛出NotSupportedException s)。如果您希望确保在跨应用程序的多个层发送时不会对其进行修改,这将非常有用。
  • ImmutableDictionary有方法可以像AddRemove那样修改它,但是它们会创建一个新的字典并返回,原始的字典保持不变并且新的不可变的副本字典被退回。

请注意

  • 通过将另一个字典实例传递给constructor来初始化ReadOnlyDictionary。这就解释了为什么ReadOnlyDictionary是可变的(如果底层字典被修改)。它只是一个保护免受直接更改的包装器。
  • 您无法使用ImmutableDictionaryHow can I create a new instance of ImmutableDictionary?
  • 的构造函数

这也解释了为什么ReadOnlyDictionary 不是线程安全的(更好:它与基础字典一样是线程安全的)。 ImmutableDictionary 线程安全,因为您无法直接或间接修改原始实例。 “修改”它的所有方法实际上都返回一个新实例。

但是如果你需要一个线程安全的字典并且它不一定是不可变的,那么请改用ConcurrentDictionary

答案 1 :(得分:4)

ReadOnlyDictionary<TKey,TValue>是围绕另一个现有IDictionary<TKey,TValue>实施对象的包装

重要的是,虽然“你”(有权访问ReadOnlyDictionary的代码)无法通过包装器对字典进行任何更改,但这并不意味着其他代码无法修改基础字典。

与其他答案所暗示的不同,你不能认为ReadOnlyDictionary不会被修改 - 只是“你”不被允许。因此,例如,您无法确定两次访问特定键的尝试是否会产生相同的结果。

答案 2 :(得分:1)

ReadOnlyDictionary

ReadOnly无法添加或删除

ImmutableDictonary

可以添加或删除,但它像字符串一样是不可变的。添加和删​​除了新对象 http://tipsandtricks.runicsoft.com/CSharp/Immutables.html