界面早期/晚期绑定.Net

Bre*_*ias 3 .net c# clr binding interface

在Wagner的" Effective C# "第23项中,他解释说

接口方法不是虚拟的......它们是具体实现的声明.

我发现这是一个难题,因为它意味着接口方法代表早期绑定,但它们具有后期绑定的行为.它唤起人们对它们如何在幕后工作的好奇心.在C++中,这将变成对vtable的讨论.在C#中,我不知道它变成了什么.有人可以说出来吗?

ps这个问题有堂兄,但这个问题主要关注界面.
请不要担心"你不需要知道它是如何工作的".再次,这是关于好奇心.

Han*_*ant 6

对,从语言的角度来看,它们不是虚拟的.但实际上它们与CLR有关.此示例代码:

class Example : IDisposable {
    public void Dispose() {}
}
Run Code Online (Sandbox Code Playgroud)

为Dispose()方法生成此IL:

.method public hidebysig newslot virtual final    // <=== here
        instance void  Dispose() cil managed
{
  // Unimportant
} // end of method Example::Dispose
Run Code Online (Sandbox Code Playgroud)

请注意方法上的属性:virtualfinal.最后一个是确保您不能覆盖派生类中的方法.使接口方法实现的行为类似于语言中的非虚方法,但在运行时则是虚拟方法.

这也回答了关于早期/晚期绑定的问题.它是早期的,当加载类时,v-table插槽被填充.