ConcurrentDictionary のドキュメントを見ると、次のように書かれています。
複数のスレッドが同時にアクセスできるキーと値のペアのスレッド セーフなコレクションを表します。
これを読むと、ConcurrentDictionary API で任意のメソッドを呼び出すことができ、スレッドセーフになると思います...しかし、これは明示的な実装も含めることを意味していましたが、その保証はありますか?
私の例は、その値が何らかの値である場合に、アトミック操作で ConcurrentDictionary から項目を削除する場合です。
だから私はこれを行うことができます:
var concurrentDictionary = new ConcurrentDictionary<string, string>();
concurrentDictionary.TryAdd("hey", "ho");
((ICollection<KeyValuePair<string, string>>) concurrentDictionary).Remove(new KeyValuePair<string, string>("hey", "ho"));
ソースコードを調べたところ、その操作はアトミックかつスレッドセーフですが、ConcurrentDictionary API にないという事実は、それを使用すべきではないことを意味します...または、コレクションを使用して実行している可能性があります私がそれを使ってはいけないこと。
さらに一歩進んで、次の拡張メソッドを記述できます。
public static boolean TryRemove(this ICollection<KeyValuePair<TKey, TValue>> collection, TKey key, TValue value)
{
return collection.Remove(new KeyValuePair<TKey, TValue>(key, value));
}
これは ConcurrentDictionary の Intellisense に表示されます。これは ICollection インターフェイスを実装しており、多くの開発者は何か問題があることさえ知らない可能性があるためです (実際に何か問題があるとしたら?!)。
編集: 「暗黙的に文書化された」とは、ConcurrentDictionary が一連のインターフェイスを実装するということです。ドキュメントには、スレッドセーフであると記載されていますが、そのページにリストされているメソッドのみについては記載されていませんが、インスタンスに対するすべての操作が安全であることを暗示しています。