C#で、これら2つのコンテナーの主な違い(機能またはユースケースの点)は何ですか? Googleでこれらを比較する情報はないようです。
System.Collections.ObjectModel.ReadOnlyDictionarySystem.Collections.Immutable.ImmutableDictionary
ImmutableDictionaryはスレッドセーフであることを理解しています。 ReadOnlyDictionaryも同じですか?
ReadOnlyDictionary
はコンストラクターを介して一度初期化でき、それから項目を追加または削除できません(それらはNotSupportedException
sをスローします)。これは、アプリケーションの複数のレイヤーに送信されている間は変更されないようにする場合に役立ちます。ImmutableDictionary
にはAdd
やRemove
のように変更するメソッドがありますが、新しい辞書を作成してそれを返します。元の辞書は変更されません。そして、新しい不変の辞書のコピーが返されます。ご了承ください
ReadOnlyDictionary
を初期化します。これが、ReadOnlyDictionary
が変更可能である理由を説明しています(基礎となる辞書が変更されている場合)。直接の変更から保護されるのは単なるラッパーです。ImmutableDictionary
のコンストラクタを使用することはできません: ImmutableDictionaryの新しいインスタンスを作成するにはどうすればよいですか?これは、ReadOnlyDictionary
がスレッドセーフではないの理由も説明します(ベター:基礎となる辞書と同じくらいスレッドセーフです)。 ImmutableDictionary
はthread-safeです。これは、元のインスタンスを(直接的にも間接的にも)変更できないためです。これを「変更」するすべてのメソッドは、実際には新しいインスタンスを返します。
ただし、スレッドセーフな辞書が必要で、それが不変である必要がない場合は、代わりに ConcurrentDictionary
を使用してください。
A ReadOnlyDictionary<TKey,TValue>
はラッパーであり、別の既存のIDictionary<TKey,TValue>
実装オブジェクト。
重要なのは、「あなた」(ReadOnlyDictionary
にアクセスできるコード)がラッパー経由でディクショナリに変更を加えることはできませんが、これはother codeが基礎となる辞書。
したがって、他の回答が示唆する可能性のあることとは異なり、ReadOnlyDictionary
が変更の対象ではないことを想定することはできません。「あなた」が許可されていないだけです。したがって、たとえば、特定のキーにアクセスしようとして2回試行しても同じ結果になるとは限りません。
ReadOnlyDictionary
is ReadOnly
は追加または削除できません
ImmutableDictonary
追加または削除できますが、文字列のように不変です。追加および削除する新しいオブジェクトがあります http://tipsandtricks.runicsoft.com/CSharp/Immutables.html