.net - 为什么构造的委托(delegate)类的调用方法是虚拟的?

标签 .net compiler-construction delegates

我在 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/

相关文章:

c# - 为自定义 WCF 绑定(bind)指定 HTTPS

.NET 框架(可卸载的应用程序?)

c++ - 为什么构造 std::string(0) 不会发出编译器警告?

C++ 编译器差异

c# - Delegate.CreateDelegate 无法绑定(bind)到静态泛型方法

.net - 使用 BinaryFormatter 序列化不同但相等的对象图是否会产生相同的二进制表示形式?

c - 编译器如何在中等内存模型中解析地址?

swift - 带有 Storyboard 的菜单栏 - validateMenuItem 未被调用

c# - 委托(delegate)和接口(interface)如何互换使用?

c# - 使用 WebAPI 2 进行 JSON.NET 抽象/派生类反序列化