c# - .Net 中的接口(interface)早期/晚期绑定(bind)

标签 c# .net interface binding clr

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

interface methods are not virtual...they are a declaration of a concrete implementation.

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

附注这个问题有a cousin , 但本题侧重于接口(interface)。
p.p.s.请不要担心“你不需要知道它是如何工作的”。同样,这与好奇心有关。

最佳答案

是的,从语言的角度来看,它们不是虚拟的。但就 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

注意方法的属性:virtualfinal。最后一个是确保您不能覆盖派生类中的方法。使接口(interface)方法实现在语言中表现得像非虚拟方法,但在运行时表现得像虚拟方法。

这也回答了您关于早期/晚期绑定(bind)的问题。时间还早,v-table slot 是在类加载的时候填充的。

关于c# - .Net 中的接口(interface)早期/晚期绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4209175/

相关文章:

Java框架布局

java - 实例化可以是具体类或接口(interface)类的 Java 类

c# - 我怎么知道我可以在 GetRow() 上转换成什么类型​​?

c# - 如何使用 EWS 托管 API 从文件夹和公共(public)文件夹的子文件夹中获取所有项目

c# - 如何在 .Net 上使用 Saxon 计算 Xpath 表达式

c# - BoundedCapacity 是否包括当前正在 TPL 数据流中处理的项目?

c# - C#中的JSON反序列化错误

c# - WriteByte,如何使用

c# - 在 C# 5 中将 WPF 事件处理程序声明为 'async' 的意义

c# - 实现派生类接口(interface)方法的抽象基类