我在 CLR via C# 中看到过在 codeproject 文章 Delegate Behind the Scenes当 C# 编译器看到这个
public delegate void MyDelegate(int intValue);
它实际上会产生这样的东西
class MyDelegate : System.MulticastDelegate
{
public virtual void Invoke(Int32 intValue);
...
}
问题是,为什么 Invoke 方法是虚拟的 ?这个生成的委托(delegate)类型可以被继承吗?从CLR的角度看起来是可以的。但为什么?为什么不生成密封类,这样在运行时就不会有虚方法查找惩罚?
最佳答案
这就像鸭子一样的嘎嘎打字。使 System.Int32(一种值类型)派生自 ValueType(一种引用类型)的类似类型。没有意义,在 C# 中是非法的,但实际上是这样的。委托(delegate)的 Invoke 方法的真正实现隐藏在 CLR 中,并且是用 C++ 编写的静态函数。
但可以肯定的是,将其注释为虚拟是有一定意义的,因为它的行为类似于虚拟方法。执行的实际代码不像使用非虚拟类方法那样固定。更难推理的是,对于绑定(bind)到静态方法的委托(delegate),正确的模型应该是什么。一个静态的虚拟方法?
它只是一只虚拟鸭子。
阅读 C 中使用的函数指针可以帮助您获得更好的委托(delegate)心智模型。委托(delegate)是一个带有铃铛的函数指针,它也可以存储目标对象。 C# 缺乏以另一种方式表达这一点的语法。
关于.net - 为什么构造的委托(delegate)类的调用方法是虚拟的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7588417/