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

Jon*_*han 4 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
Run Code Online (Sandbox Code Playgroud)

问题ConcurrentDictionary和IDictionary告诉我这是因为使用私有方法显式ConcurrentDictionary实现IDictionary.

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

Jon*_*eet 5

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

我相信这是鼓励你想到并发的含义 - 多个线程可能同时写入相同的密钥.因此,添加现有密钥不太可能成为编程错误,应该仔细考虑.

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

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