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

标签 c# .net delegates implementation internal

我理解委托(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/

相关文章:

.net - 如何使上下文菜单出现在datagridview单元的右键单击上

c# - 使用 SharpZipLib 解压 .tar.gz

c# - 带有用于服务器端渲染的 Javascript View 引擎的 Asp.Net MVC - 服务器上的构建错误

c# - 命名空间错误 OfficeOpenXML EPPlus

c# - WriteByte,如何使用

c# - 通过反射在 C# 中获取委托(delegate)集合的所有具体实现

ios - 从 UIPickerView 自定义委托(delegate)和数据源获取选定值

ios - 委托(delegate)返回不正确的 ViewController 实例号

c# - 使用 Microsoft.JScript 的 JavaScript 和 C# 插值

c# - 是否可以在样式中使用转换器?