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的角度来看,它可以.但为什么?为什么不生成密封类,因此在运行时不会有虚拟方法查找惩罚?
这是鸭子般的嘎嘎打字。类似类型的类型使 System.Int32(一种值类型)派生自 ValueType(一种引用类型)。没有意义,在 C# 中是非法的,但实际上是这样的。委托的 Invoke 方法的真正实现隐藏在 CLR 中,并且是用 C++ 编写的静态函数。
但可以肯定的是,将其注释为 virtual 是有一定道理的,因为它的行为就像一个 virtual 方法。实际执行的代码并不像非虚拟类方法那样固定。更难推理出绑定到静态方法的委托的正确模型应该是什么。静态的虚拟方法?
它只是一只虚拟的鸭子。
阅读 C 中使用的函数指针可以帮助您为委托获得更好的心智模型。委托是一个带有响铃的函数指针,它也可以存储目标对象。C# 缺乏以另一种方式表达这一点的语法。