48

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

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

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

これはIReadOnlyDictionary を適切に使用するには?の複製ではありません。. その質問は、IReadOnlyDictionary の使用方法に関するものです。この質問は、2つの違いについてです(2015年に誰かがそのスレッドにコメントしたように、別の質問になります-つまり、これです)

4

4 に答える 4

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

ご了承ください:

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

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

于 2017-10-24T13:05:01.203 に答える
8

AReadOnlyDictionary<TKey,TValue>は、別の既存の実装オブジェクトのラッパーです。IDictionary<TKey,TValue>

重要なのは、「あなた」 ( にアクセスできるコードReadOnlyDictionary) がラッパーを介してディクショナリに変更を加えることはできませんが、これは、他のコードが基になるディクショナリを変更できないという意味ではありません。

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

于 2017-10-24T13:20:06.420 に答える