2014-02-18 24 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

相关问题