【发布时间】:2017-06-08 10:12:20
【问题描述】:
我一直在尝试了解有关 CLR 的更多信息,同时注意到 C# 中的以下接口将被编译为包含某种“抽象接口”的 IL。
鉴于在 C# 中将接口声明为抽象是无效的,那么在 IL 级别允许抽象接口意味着什么?最初我想知道这是否是运行时在内部表示接口的方式,通过声明一个抽象 class 从而防止它被更新。
它似乎确实遵循了这个想法,如.class 所示。但是,紧随其后的是interface。因此,当运行时似乎已经支持接口的概念时,需要实际创建抽象 类 的想法似乎没有意义。
这让我想到了几个问题:
- 抽象接口的目的是什么,为什么抽象接口在 IL 级别有效?
- 为什么
.class和interface是必要的,为什么这在 IL 级别有效? - 如果运行时支持接口的概念,为什么需要
.class或abstract?
C#:
public interface IExample
{
void SomeMethod(int number);
}
IL:
.class interface public auto ansi abstract IExample
{
// Methods
.method public hidebysig newslot abstract virtual
instance void SomeMethod (
int32 number
) cil managed
{
} // end of method IExample::SomeMethod
}
【问题讨论】:
-
从语言语法到元数据属性的映射并不总是显而易见的。一般来说,CLR 允许更多,语言设计者选择他想要使用的内容。在这种特定情况下,C# 编译器仅遵循 Ecma-335 第 II.22.37 节中规定的元数据规则:“23. 接口应具有 Flags.Abstract = 1”。将该规范放在手边,您在浏览 MSIL 时会用到它。
-
这是一个有趣的摘录,谢谢,现在正在阅读。但它并没有给出做出该决定的原因。
-
这是规则的好处,你不必担心如果你不遵守规则可能意味着什么;)