gpt4 book ai didi

c# - 在.NET 中,委托(delegate)的内部实现是什么?

转载 作者:IT王子 更新时间:2023-10-29 04:48:46 24 4
gpt4 key购买 nike

我理解委托(delegate)的声明是这样的:

public delegate int PerformCalculation(int x, int y);

但是,一定还有更多的事情要做。委托(delegate)的目的是提供指向方法的指针,为此您将对方法的引用封装在委托(delegate)中。

这个引用保存在什么样的结构中(在委托(delegate)内部)?我还了解到您可以在委托(delegate)中封装对多个方法的引用。这是否意味着委托(delegate)中有一个数组来保存这些?

此外,在委托(delegate)中定义了哪些方法等。当您使用简洁声明委托(delegate)时真正发生了什么:

public delegate int PerformCalculation(int x, int y);

?

编辑:一些说明。当您声明委托(delegate)时,编译器自动为您创建一个密封类,该类继承自 System.MulticastDelegate。如果您使用 ildasm 查看您的程序集,您可以看到这一点。这个整洁。基本上,只需一条语句,您就可以在编译时为您生成一个全新的类,并且它具有您需要的所有功能。

最佳答案

在内部它是一个引用类型,非常类似于一个类。转录它看起来像这样:

public /* delegate */ class PerformCalculation : MulticastDelegate {
public PerformCalculation(object target, IntPtr method) {}
public virtual void Invoke(int x, int y) {}
public virtual IAsyncResult BeginInvoke(int x, int y, AsyncCallback callback, object state) {}
public virtual void EndInvoke(IAsyncResult result) {}
}

我将这些成员的实现留空,它们实际上映射到 CLR 中的代码。编译器根据委托(delegate)声明的签名动态生成方法签名。注意 x 和 y 参数。 JIT 编译器使用 += 或 -= 语法帮助调用构造函数,它知道委托(delegate)目标方法的内存地址。编译器根据目标方法是否为静态自动生成目标 参数值。这两个参数映射到 (Multicast)Delegate.Target 和 Method 属性。实际的基类实例可以是 Delegate 或 MulticastDelegate,具体取决于订阅的目标数量。

这里有很多秘诀。

关于c# - 在.NET 中,委托(delegate)的内部实现是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4641932/

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