为什么Invoke方法构造的委托类是虚拟的?

alp*_*use 8 .net compiler-construction delegates

我已经通过C#CLR中看到过,并且在代码项目文章" 幕后委托"中看到,当C#编译器看到这个时

public delegate void MyDelegate(int intValue);
Run Code Online (Sandbox Code Playgroud)

它实际上产生了这样的东西

class MyDelegate : System.MulticastDelegate
{
    public virtual void Invoke(Int32 intValue);

    ...
}
Run Code Online (Sandbox Code Playgroud)

问题是,为什么Invoke方法是虚拟的?这个生成的委托类型可以继承吗?从CLR的角度来看,它可以.但为什么?为什么不生成密封类,因此在运行时不会有虚拟方法查找惩罚?

Han*_*ant 1

这是鸭子般的嘎嘎打字。类似类型的类型使 System.Int32(一种值类型)派生自 ValueType(一种引用类型)。没有意义,在 C# 中是非法的,但实际上是这样的。委托的 Invoke 方法的真正实现隐藏在 CLR 中,并且是用 C++ 编写的静态函数。

但可以肯定的是,将其注释为 virtual 是有一定道理的,因为它的行为就像一个 virtual 方法。实际执行的代码并不像非虚拟类方法那样固定。更难推理出绑定到静态方法的委托的正确模型应该是什么。静态的虚拟方法?

它只是一只虚拟的鸭子。

阅读 C 中使用的函数指针可以帮助您为委托获得更好的心智模型。委托是一个带有响铃的函数指针,它也可以存储目标对象。C# 缺乏以另一种方式表达这一点的语法。