考虑这些代码行:
ConcurrentDictionary<string, object> error = new ConcurrentDictionary<string, object>();
error.Add("hello", "world"); //actually throws a compiler error
和
IDictionary<string, object> noError = new ConcurrentDictionary<string, object>();
noError.Add("hello", "world");
我最终发现您所要做的就是更改 IL 以生成 Add
函数私有(private)。
现在,本着解耦代码的精神,我很可能会使用接口(interface),但似乎并发字典不太适合 Add
方法。
真正使用安全吗Add
(我无法查看 IL,所以我不知道它是否真的是线程安全的。)?或者我应该使用 ConcurrentDictionary<TKey, TValue>
的具体类型吗?并明确使用 TryAdd
.
最佳答案
是的,它很安全。
看看 reference source for ConcurrentDictionary .方法IDictionary<TKey, TValue>.Add
只需调用 TryAdd
如果 key 已经存在,则抛出异常。
隐藏接口(interface)成员不需要修改 IL。可以通过explicit interface implementation来完成在 C# 中。这是通过省略方法的访问修饰符并在方法名称前加上接口(interface)名称来完成的:
void IDictionary<TKey,TValue>.Add(TKey key, TValue value) {}
这样做有多种原因,也许你不想让具体的接口(interface)变得困惑,或者你希望你的类的使用者明确说明他们正在使用什么方法,如果接口(interface)上的方法名称不是不够具体。此外,它允许您为具有相同签名的不同接口(interface)上的方法提供单独的实现(我认为 ConcurrentDictionary
并不是真正的问题,但如果您在自己的类中需要它,该功能就在那里)。
关于c# - 在 IL 中隐藏接口(interface)的公共(public)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29637682/