在C#中,这两个容器之间的关键区别(在功能或用例方面)是什么?似乎没有任何信息可以在Google上比较这些信息。
System.Collections.ObjectModel.ReadOnlyDictionary System.Collections.Immutable.ImmutableDictionary
我知道ImmutableDictionary是线程安全的。 ReadOnlyDictionary也是如此吗?
答案 0 :(得分:22)
ReadOnlyDictionary
可以通过构造函数初始化一次,然后就无法添加或删除项目(它们抛出NotSupportedException
s)。如果您希望确保在跨应用程序的多个层发送时不会对其进行修改,这将非常有用。ImmutableDictionary
有方法可以像Add
或Remove
那样修改它,但是它们会创建一个新的字典并返回,原始的字典保持不变并且新的不可变的副本字典被退回。请注意
ReadOnlyDictionary
。这就解释了为什么ReadOnlyDictionary
是可变的(如果底层字典被修改)。它只是一个保护免受直接更改的包装器。 ImmutableDictionary
:How 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