6

IDictionaryにはGetOrAddメソッドとAddOrUpdateメソッドがないため、ConcurrentDictionaryからIDictionaryへのキャストはスレッドセーフな実装を遮断しますか?

4

5 に答える 5

10

結果のオブジェクトは、依然として並行辞書になります。Add や Remove などの呼び出しは、基になる実装の TryAdd と TryRemove (スレッドセーフ) を使用します。オブジェクトを別の型にキャストしても、オブジェクト自体は変更されません。

また、明確にするために、ILSpy などのツールを使用して、デフォルトの IDictionary メソッドの実装と、それらがまだスレッドセーフであるかどうかを確認できます。

于 2012-04-11T19:04:40.370 に答える
6

IDictionary単なるインターフェースです。それにキャストすると、結果は ConcurrentDictionary の実装になり、メソッドGetOrAddAddOrUpdateメソッドが欠落します。

Itemおそらく、プロパティと Addandメソッドを ( and ) メソッドContainsKeyの代わりに引き続き使用でき、キャストされたオブジェクトは引き続きスレッドセーフになります (基になる実装が であるため)。GetOrAddAddOrUpdateConcurrentDictionary

于 2012-04-11T19:02:30.753 に答える
1

インターフェイスは実装に影響しません。ConcurrentDictionaryのメソッドの一部が公開されていないだけです。

thisまたはthisは、インターフェイスを理解するのに役立つ場合があります。

于 2012-04-11T19:02:59.023 に答える
0

それは、形をした鍵穴を通して大きなConcurrentDictionary物体を見ているようなものです。IDictionaryIDictionaryConcurrentDictionary

于 2012-04-11T19:11:30.593 に答える
-2

短い答えいいえ。

インターフェイスを介してオブジェクトを操作しているため、具象実装を引き続き使用しています。機能やそのメソッドが失われることはありません。それらは利用できません。

ちなみに、ダウンキャスト時には明示的なキャストが必要ですが、アップキャスト時には明示的なキャストは必要ありません。常に安全に行うことができます。

于 2012-04-11T19:20:39.613 に答える