为什么Concurrent Dictionary没有可见的Add()方法?

Len*_*y D 7 c# concurrency multithreading dictionary

我只是想知道ConcurrentDictionary是否有可能没有在Visual Studio IDE中可见的Add方法.我似乎只获得了TryX方法,例如TryAdd,TryUpdate等.

我可以看到ConcurrentDictionary实现IDictionary,如果我把它转换为IDictionary我得到Add方法.

我通过iLSpy查看了这个类,我可以看到Add方法已经完全实现,并且实际上是TryAdd在引擎下调用Concurrent 方法.

我期待在Add方法上看到某种属性来压制它,但我没有看到任何东西.

微软是否已将其烘焙到IDE中以隐藏Add方法?

如果有人能够对此有所了解,我们将不胜感激

Sam*_*ell 8

他们不鼓励使用该Add方法,因为如果密钥已经存在于字典中,则该方法会抛出异常.对于大多数字典,开发人员可以编写代码以保证在任何正常情况下都不会抛出异常.但是,要使用并发字典执行此操作(Contains后跟Add),您需要在访问字典的方法中使用排它锁,这会破坏并发字典的整个目的.

TryAdd结合ContainsAdd检查而不需要你锁定字典,并允许你再次编写在正常情况下不会抛出异常的代码.


ken*_*n2k 7

这是因为显式接口实现.请参阅http://msdn.microsoft.com/en-us/library/aa288461(v=vs.71).aspx

  • 实际上,我想知道为什么MS完全从IDictionary派生ConcurrentDictionary!ConcurrentDictionary应该鼓励您使用TryAdd()而不是ContainsKey()/ Add()对,因为后者在并发上下文中并不安全。这是通过隐藏这些方法来完成的。但是,只要一接受IDictionary,并且您通过ConcurrentDictionary,就不会有任何并发​​安全性!那么:为什么要这样做MS? (2认同)
  • 答案中的链接不再有效(msdn 大惊喜!)替代答案:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation (2认同)