web-dev-qa-db-ja.com

ReadOnlyDictionaryとImmutableDictionaryの違いは何ですか?

C#で、これら2つのコンテナーの主な違い(機能またはユースケースの点)は何ですか? Googleでこれらを比較する情報はないようです。

System.Collections.ObjectModel.ReadOnlyDictionarySystem.Collections.Immutable.ImmutableDictionary

ImmutableDictionaryはスレッドセーフであることを理解しています。 ReadOnlyDictionaryも同じですか?

23
matt_rule
  • A ReadOnlyDictionary はコンストラクターを介して一度初期化でき、それから項目を追加または削除できません(それらはNotSupportedExceptionsをスローします)。これは、アプリケーションの複数のレイヤーに送信されている間は変更されないようにする場合に役立ちます。
  • ImmutableDictionary にはAddRemoveのように変更するメソッドがありますが、新しい辞書を作成してそれを返します。元の辞書は変更されません。そして、新しい不変の辞書のコピーが返されます。

ご了承ください

これは、ReadOnlyDictionaryスレッドセーフではないの理由も説明します(ベター:基礎となる辞書と同じくらいスレッドセーフです)。 ImmutableDictionarythread-safeです。これは、元のインスタンスを(直接的にも間接的にも)変更できないためです。これを「変更」するすべてのメソッドは、実際には新しいインスタンスを返します。

ただし、スレッドセーフな辞書が必要で、それが不変である必要がない場合は、代わりに ConcurrentDictionary を使用してください。

33
Tim Schmelter

A ReadOnlyDictionary<TKey,TValue>ラッパーであり、別の既存のIDictionary<TKey,TValue>実装オブジェクト。

重要なのは、「あなた」(ReadOnlyDictionaryにアクセスできるコード)がラッパー経由でディクショナリに変更を加えることはできませんが、これはother codeが基礎となる辞書。

したがって、他の回答が示唆する可能性のあることとは異なり、ReadOnlyDictionaryが変更の対象ではないことを想定することはできません。「あなた」が許可されていないだけです。したがって、たとえば、特定のキーにアクセスしようとして2回試行しても同じ結果になるとは限りません。

ReadOnlyDictionary

is ReadOnlyは追加または削除できません

ImmutableDictonary

追加または削除できますが、文字列のように不変です。追加および削除する新しいオブジェクトがあります http://tipsandtricks.runicsoft.com/CSharp/Immutables.html

1
Snr