c# - 在 IL 中隐藏接口(interface)的公共(public)成员

标签 c# il

考虑这些代码行:

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/

相关文章:

.net-4.0 - 为什么 LocalBuilder.SetLocalSymInfo 不发出变量名?

c# - 为什么 c# 编译器在某些情况下会发出 newobj/stobj 而不是 'call instance .ctor' 来进行结构初始化

c# - 有什么理由更喜欢模拟接口(interface)而不是具有可覆盖成员的类?

c# - 附加属性抛出 ParseException

.net - 如何在 CLR 上学习 IL

c# - 为什么编译器允许我将 null 转换为 C# 中的特定类型?

c# - 如何为 ulong.Parse 调用发出 LDC_I8?

c# - 如何以编程方式将循环转换为单个表达式?

c# - EF Code First 多对多关系在链接表中存储附加数据

c# - 访问 Controller 类中的 appsettings.json 值