C# 为什么我需要从ConcurrentDictionary转换为IDictionary才能使用Add()?
如果我有一个C# 为什么我需要从ConcurrentDictionary转换为IDictionary才能使用Add()?,c#,concurrency,concurrentdictionary,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 var c
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
var cd=new concurrentdirectionary();
cd.添加(1,1);//编译错误:不包含“添加”的定义
id字典id=cd;
id.Add(1,1);//作品
问题告诉我这是因为ConcurrentDictionary
使用私有方法显式实现了IDictionary
我的问题:为什么ConcurrentDictionary
是这样实现的?隐藏已实现接口的使用有什么好处
我的问题是:为什么ConcurrentDictionary是这样实现的
我相信这是为了鼓励您考虑并发的含义——多个线程可能同时编写相同的密钥。因此,添加现有密钥不太可能是编程错误,应该仔细考虑
- 如果要无条件覆盖,请使用索引器
- 如果要添加或更新,更新可以使用现有值,请使用
AddOrUpdate
- 如果希望尽可能添加,但不覆盖任何现有值,请使用
TryAdd
如果您发现自己经常需要现有的
Add
行为,您可以编写自己的扩展方法。我认为您可以尝试使用ConcurrentDictionary中的TryAdd()或AddOrUpdate()方法,如图所示
这可能也是因为
IDictionary.Add
被简单地实现为if(!TryAdd(…)throw代码>,它非常简单,即使在对并发字典有意义的情况下,调用方仍然可以选择执行完全相同的操作,而不必通过IDictionary
访问字典。