4

ConcurrentDictionaryがあり、その関数を使用したい場合は、次のAdd()ようにキャストする必要がありますIDictionary

var cd = new ConcurrentDictionary<int, int>();
cd.Add(1, 1);  // Compile error: does not contain a definition for 'Add'
IDictionary<int, int> id = cd;
id.Add(1, 1);  // Works

質問ConcurrentDictionary と IDictionaryは、プライベート メソッドを使用して明示的にConcurrentDictionary実装しているためだと教えてくれます。IDictionary

私の質問:なぜそのようにConcurrentDictionary実装されているのですか? 実装されたインターフェースの使用を隠すことの利点は何ですか?

4

2 に答える 2

5

私の質問: ConcurrentDictionary がそのように実装されているのはなぜですか?

複数のスレッドが同時に同じキーを書き込んでいる可能性があるという、並行性の意味について考えるように促すためだと思います。したがって、既存のキーを追加することは、プログラミング エラーである可能性がやや低く、慎重に検討する必要があります。

  • 無条件に上書きしたい場合はインデクサーを使う
  • 更新で既存の値を使用できる場合に追加または更新する場合は、次を使用します。AddOrUpdate
  • 可能であれば追加したいが、既存の値を上書きしたくない場合は、TryAdd

既存のAdd動作が頻繁に必要になる場合は、いつでも独自の拡張メソッドを作成できます。

于 2014-02-18T08:15:28.993 に答える
0

ここでわかるように、ConcurrentDictionay の TryAdd() または AddOrUpdate() メソッドを使用してみることができると思います。

http://msdn.microsoft.com/es-es/library/dd287191(v=vs.110).aspx

于 2014-02-18T08:18:12.700 に答える