在C#中,这两个容器之间的主要区别(就功能或用例而言)是什么?似乎没有任何信息可以在Google上进行比较。

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

我知道ImmutableDictionary是线程安全的。 ReadOnlyDictionary是否也一样?

最佳答案

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

  • 注意:
  • 您可以通过将另一个字典实例传递给constructor来初始化ReadOnlyDictionary。这就解释了为什么ReadOnlyDictionary是可变的(如果基础字典已被修改)。它只是一个包装,可以防止直接更改。
  • 您不能为ImmutableDictionary使用构造函数:How can I create a new instance of ImmutableDictionary?

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

    但是,如果您需要一个线程安全的字典,并且它不一定是不变的,则可以使用 ConcurrentDictionary 代替。

    10-07 20:01