界面早期/晚期绑定.Net

时间:2010-11-17 21:06:52

标签: c# .net interface binding clr

在瓦格纳的“Effective C#”第23项中,他解释说

  

接口方法不是   虚拟......他们是一个宣言   具体实施。

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

P.S。这个问题有a cousin,但这个问题主要关注接口 p.p.s.请不要担心“你不需要知道它是如何工作的”。再次,这是关于好奇心。

1 个答案:

答案 0 :(得分:6)

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

class Example : IDisposable {
    public void Dispose() {}
}

为Dispose()方法生成此IL:

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

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

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