2012-04-11 17 views
6

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

+0

"カット"、どういう意味ですか? 'ConcurrentDictionary'からそれを削除しますか?いいえ、IDictionaryのインターフェースから利用できますか?いいえ。 –

+2

@ JamesMichaelHare:彼は、あなたが 'IDictionary'にキャストすると、結果として得られるオブジェクトがスレッドセーフなものになるのでしょうか?言い換えれば、通常の辞書に変換されますか? –

+0

それでもスレッドセーフなのでしょうか?はい、それはそのような操作なしでも可能です。つまり、アトミックな 'GetOrAdd()'が必要な場合は、不運になります。 –

答えて

10

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

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

+0

また、ConcurrentDictionaryの 'IDictionary メソッドの実装に関するMSDNのドキュメントを見ることができます:http://msdn.microsoft.com/en-us/library/dd287191.aspx – phoog

6

IDictionaryは単なるインターフェイスです。キャストすると、ConcurrentDictionaryの実装で、GetOrAddAddOrUpdateのメソッドが欠けています。

おそらく、あなたはまだItemプロパティを使用することができますし、(GetOrAddAddOrUpdateの代わりに)AddContainsKey方法方法、および(基本となる実装がConcurrentDictionaryあるので)あなたのキャストオブジェクトは、まだスレッドセーフになります。

1

インターフェイスは実装に影響しません。それはちょうどConcurrentDictionaryのメソッドの一部を公開していません。

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

0

それはIDictionary形の鍵穴を通じて大きなConcurrentDictionaryオブジェクトを見ているようなものだ - あなただけのIDictionary形状を見ることができたが、それはまだConcurrentDictionaryだろう。

-1

短答No。

オブジェクトをインターフェイスで操作しているため、具体的な実装を使用しています。機能やその方法を失うことはありません。彼らはただ利用できません。

ダウンキャストの場合は明示的なキャストが必要です。アップキャストの場合は明示的なキャストは必要ありません。常にキャストしてください。

+0

申し訳ありませんがConcurrentDictionaryは2つの新しい新しいメソッドに対してのみスレッドセーフを追加し、隠しメソッドには追加しないようにすることができます。 MSDNのドキュメントはそれを明確にしていないので、私はそれに尋ねました。しかし、私が一番のコメントを読んだ後、ConcurrentDictionaryプロトタイプを見てみると、Dictionaryを拡張していないことがわかりました。これはIDictionaryにキャストすることが間接的に拡張バージョンディクショナリを使用することはありえないと私を安心させました。 – Luciano

関連する問題