在.NET中,委托的内部实现是什么?

时间:2011-01-09 21:25:16

标签: c# .net delegates implementation internal

我理解委托人的声明是这样的:

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

然而,必须有更多的事情发生。委托的目的是提供指向方法的指针,为此,您将对方法的引用封装在委托中。

这个引用是什么类型的结构(代表内部)?我也明白你可以在委托中封装对多个方法的引用。这是否意味着委托中有一个包含这些数组的数组?

此外,委托中定义了哪些方法等。当您使用简洁声明委托时,实际发生了什么:

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

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

2 个答案:

答案 0 :(得分:19)

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

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

这里有很多秘密酱油。

答案 1 :(得分:8)

所有代表都从System.Delegate类型继承,该类型包含TargetMethod。更确切地说,它们继承自System.Delegate继承的System.MultiCastDelegate