委托人的构造函数和成员函数在哪里定义?

时间:2010-10-05 08:52:59

标签: c# .net delegates reflector

当我在Reflector中查看Action个委托时,我看到它有一个像

这样的构造函数
public Action(object @object, IntPtr method);

但我找不到任何相同的身体以及InvokeBeginInvoke等其他成员函数。我只能看到它的定义。这些功能在哪里定义?它们是在.net BCL之外定义的吗?

1 个答案:

答案 0 :(得分:4)

代表们基本上由CLR特别处理。编译器提供签名,但CLR知道如何处理它们。

ECMA-335分区的第8.9.3节我谈到了这个:

  

委托是面向对象的函数指针等价物。与函数指针不同,代理是   面向对象,类型安全和安全。通过定义从基类型派生的类来创建委托   System.Delegate(参见Partition IV)。每个委托类型都应提供一个名为Invoke的方法   参数和委托的每个实例将对其Invoke方法的调用转发给一个或多个兼容的   特定对象上的静态或实例方法。在何时选择它所委托的对象和方法   委托实例已创建。

     

除了实例构造函数和Invoke方法之外,委托还可以选择另外两个   方法:BeginInvoke和EndInvoke。这些用于异步调用。

     

虽然在大多数情况下,委托似乎只是另一种用户定义的类,但它们是紧密的   受控。这些方法的实现由VES提供,而不是用户代码。唯一的补充   可以在委托类型上定义的成员是静态或实例方法。

(VES是虚拟执行系统; CLR是微软对VES的实现。)