IDictionaryにGetOrAddメソッドとAddOrUpdateメソッドがないため、ConcurrentDictionaryからIDictionaryへのキャストはスレッドセーフ実装を切断しますか?ConcurrentDictionaryからIDictionaryへキャスト
答えて
結果のオブジェクトはまだコンカレント辞書になります。 AddやRemoveのような呼び出しは、基礎となる実装TryAddとTryRemove(スレッドセーフです)を使用します。オブジェクトを別の型にキャストしても、オブジェクト自体は変更されません。
また、ILSpyのようなツールを使用して、デフォルトのIDictionaryメソッドの実装とスレッドセーフであるかどうかを確認できます。
また、ConcurrentDictionaryの 'IDictionary
IDictionary
は単なるインターフェイスです。キャストすると、ConcurrentDictionaryの実装で、GetOrAdd
とAddOrUpdate
のメソッドが欠けています。
おそらく、あなたはまだItem
プロパティを使用することができますし、(GetOrAdd
とAddOrUpdate
の代わりに)Add
とContainsKey
方法方法、および(基本となる実装がConcurrentDictionary
あるので)あなたのキャストオブジェクトは、まだスレッドセーフになります。
それはIDictionary
形の鍵穴を通じて大きなConcurrentDictionary
オブジェクトを見ているようなものだ - あなただけのIDictionary
形状を見ることができたが、それはまだConcurrentDictionary
だろう。
短答No。
オブジェクトをインターフェイスで操作しているため、具体的な実装を使用しています。機能やその方法を失うことはありません。彼らはただ利用できません。
ダウンキャストの場合は明示的なキャストが必要です。アップキャストの場合は明示的なキャストは必要ありません。常にキャストしてください。
申し訳ありませんがConcurrentDictionaryは2つの新しい新しいメソッドに対してのみスレッドセーフを追加し、隠しメソッドには追加しないようにすることができます。 MSDNのドキュメントはそれを明確にしていないので、私はそれに尋ねました。しかし、私が一番のコメントを読んだ後、ConcurrentDictionaryプロトタイプを見てみると、Dictionaryを拡張していないことがわかりました。これはIDictionaryにキャストすることが間接的に拡張バージョンディクショナリを使用することはありえないと私を安心させました。 – Luciano
- 1. IDictionaryとConcurrentDictionaryのスレッドセーフティに関する考慮
- 2. キャストからdatetimeへのキャスト
- 3. IDictionaryをとる関数にConcurrentDictionary型を渡すことは安全ですか?
- 4. HttpServletRequestからWebRequestへのキャスト
- 5. float32からgoへのキャスト
- 6. void *からstructへのキャスト
- 7. インターフェイスからQObjectへのキャスト
- 8. 入れ子のインターフェイス:IDictionary <TKey、IEnumerable <TValue>>にIDictionary <TKey、IList <TValue>>をキャストしますか?
- 9. IDictionary
- 10. 'System.String'から 'Sitecore.ContentSearch.ProviderIndexConfiguration'への無効なキャスト
- 11. IEnumerableからIEnumerableへのキャスト<object>
- 12. 構造体からLPVOIDへの型キャスト
- 13. JSONObjectからJSONObjectクラスへのキャスト例外
- 14. 文字列からCommPortIdentifierへのキャスト
- 15. intからlong intへの型キャスト
- 16. NSStringから "const std :: string&"へのキャスト
- 17. 変数doubleから整数へのキャスト
- 18. あるオブジェクトから別のオブジェクトへキャスト
- 19. ListModelからJava 7のDefaultListModelへのキャスト
- 20. HashMapキーイテレータからリストイテレータへのキャスト
- 21. intから小数点へのキャスト
- 22. Laravel JSONから配列キャストへ
- 23. 'System.String'から 'Sitecore.Analytics.Reporting.Filters.IDataSourceFilterFactory'への無効なキャスト
- 24. キャストvoid *からintとbackへ
- 25. C++ operator =オブジェクトからdoubleへキャスト
- 26. C++型キャスト:voidポインタからクラスポインタへのポインタをキャスト
- 27. キャストと符号なしから符号付きへのキャスト
- 28. MFCキャストへのポインタとDIBからDDBへの変換
- 29. 他の子への親から子へのキャスト
- 30. 派生から基底へのオブジェクトと背面へのキャスト
"カット"、どういう意味ですか? 'ConcurrentDictionary'からそれを削除しますか?いいえ、IDictionaryのインターフェースから利用できますか?いいえ。 –
@ JamesMichaelHare:彼は、あなたが 'IDictionary'にキャストすると、結果として得られるオブジェクトがスレッドセーフなものになるのでしょうか?言い換えれば、通常の辞書に変換されますか? –
それでもスレッドセーフなのでしょうか?はい、それはそのような操作なしでも可能です。つまり、アトミックな 'GetOrAdd()'が必要な場合は、不運になります。 –