代码之家  ›  专栏  ›  技术社区  ›  Brent Arias

.Net中的接口早/晚绑定

  •  3
  • Brent Arias  · 技术社区  · 14 年前

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

    接口方法不是 虚拟的…它们是 具体实施。

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

    p、 这个问题有 a cousin ,但这个问题的重点是接口。
    p、 另外,请不要担心“你不需要知道它是如何工作的。”再说一遍,这是关于好奇心的。

    1 回复  |  直到 8 年前
        1
  •  6
  •   Hans Passant    14 年前

    对,从语言的角度来看,它们不是虚拟的。但实际上,就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槽被填充。

    推荐文章