ReadOnlyDictionary和ImmutableDictionary之间有什么区别?

mat*_*ule 21 .net c# immutable-collections

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

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

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

Tim*_*ter 28

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

注意

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

但是如果你需要一个线程安全的字典并且它不一定是不可变的,那就用一个ConcurrentDictionary代替.

  • 我们将在 Net8 中使用 FrozenDictionary,它的读取速度应该比 ImmutableDictionary 更快 (2认同)

Dam*_*ver 7

AReadOnlyDictionary<TKey,TValue>是另一个现有实现对象的包装器IDictionary<TKey,TValue>

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

因此,与其他答案可能暗示的不同,您不能假设ReadOnlyDictionary不受修改 - 只是不允许“您”进行修改。因此,例如,您无法确定两次访问特定密钥的尝试会产生相同的结果。