在 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
注意方法的属性:virtual 和final。最后一个是确保您不能覆盖派生类中的方法。使接口(interface)方法实现在语言中表现得像非虚拟方法,但在运行时表现得像虚拟方法。
这也回答了您关于早期/晚期绑定(bind)的问题。时间还早,v-table slot 是在类加载的时候填充的。
关于c# - .Net 中的接口(interface)早期/晚期绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4209175/