为什么我需要从ConcurrentDictionary转换为Dictionary才能使用Add()?

时间:2014-02-18 08:12:30

标签: c# concurrency concurrentdictionary

如果我有ConcurrentDictionary并希望使用Add()功能,我需要转发IDictionary

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是这样执行的?隐藏使用已实现的接口有什么好处?

2 个答案:

答案 0 :(得分:5)

  

我的问题:为什么ConcurrentDictionary实现了那样?

我认为鼓励你考虑并发问题 - 多个线程可能同时编写相同的密钥。因此,添加现有密钥不太可能成为编程错误,应该仔细考虑。

  • 如果要无条件覆盖,请使用索引器
  • 如果要添加或更新,更新可以使用现有值,请使用AddOrUpdate
  • 如果您想尽可能添加但不覆盖任何现有值,请使用TryAdd

如果您发现自己经常需要现有的Add行为,则可以随时编写自己的扩展方法。

答案 1 :(得分:0)

我认为您可以尝试使用ConcurrentDictionay中的TryAdd()或AddOrUpdate()方法,如您所见。

http://msdn.microsoft.com/es-es/library/dd287191(v=vs.110).aspx