2014-02-18 23 views
4

如果我有一個ConcurrentDictionary並希望使用Add()功能,我需要轉換爲IDictionary爲什麼我需要從ConcurrentDictionary轉換爲IDictionary才能使用Add()?

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 and IDictionary告訴我,那是因爲ConcurrentDictionary工具IDictionary明確,使用私有的方法。

我的問題:爲什麼ConcurrentDictionary這樣實現的?隱藏使用已實現的界面有什麼好處?

回答

5

我的問題:爲什麼ConcurrentDictionary是這樣實現的?

我相信這是鼓勵你考慮併發的含義 - 多個線程可能同時寫入相同的密鑰。因此添加現有的密鑰不太可能是編程錯誤,應該仔細考慮。

  • 如果你要無條件地覆蓋,如果你想添加或更新,在更新可以使用現有的值,使用AddOrUpdate
  • 如果你想,如果可以添加使用索引
  • ,但沒有覆蓋任何現有的值,使用TryAdd

如果你發現自己經常想現有Add行爲,你總是可以編寫自己的擴展方法。

+0

這可能也是因爲'IDictionary.Add'被簡稱爲'如果扔...實施(TryAdd(...)!);',它是如此的微不足道,即使在那些情況下,該對於併發字典是有意義的,調用者仍然可以選擇做同樣的事情,而不必通過「IDictionary」訪問字典。 – hvd

相關問題