4

如果我有一个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 和 IDictionary告诉我这是因为使用私有方法显式ConcurrentDictionary实现。IDictionary

我的问题:为什么ConcurrentDictionary这样实施?隐藏已实现接口的使用有什么好处?

4

2 回答 2

5

我的问题:为什么 ConcurrentDictionary 是这样实现的?

我相信这是为了鼓励您考虑并发影响——多个线程可能同时编写相同的键。因此,添加现有密钥不太可能是编程错误,应谨慎考虑。

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

如果你发现自己经常想要现有的Add行为,你总是可以编写自己的扩展方法。

于 2014-02-18T08:15:28.993 回答
0

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

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

于 2014-02-18T08:18:12.700 回答