gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:50:18 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com