当我Action
在 Reflector 中查看代表时,我看到它有一个构造函数,例如
public Action(object @object, IntPtr method);
但是我找不到任何与其他成员函数(如 等)相同的主体Invoke
。BeginInvoke
我只能看到它的定义。这些函数是在哪里定义的?它们是在 .net BCL 之外定义的吗?
基本上,代表由 CLR 专门处理。编译器提供签名,但 CLR 知道如何处理它们。
ECMA-335分区的第 8.9.3 节我谈到了这个:
委托是函数指针的面向对象等价物。与函数指针不同,委托是面向对象的、类型安全的和安全的。委托是通过定义派生自基类型 System.Delegate 的类来创建的(请参阅第 IV 部分)。每个委托类型应提供一个名为 Invoke 的方法,并带有适当的参数,并且委托的每个实例都将对其 Invoke 方法的调用转发给特定对象上的一个或多个兼容的静态或实例方法。在创建委托实例时选择它所委托的对象和方法。
除了实例构造函数和 Invoke 方法之外,委托还可以选择具有两个附加方法:BeginInvoke 和 EndInvoke。这些用于异步调用。
虽然在大多数情况下,委托似乎只是另一种用户定义的类,但它们受到严格控制。方法的实现由 VES 提供,而不是用户代码。可以在委托类型上定义的唯一附加成员是静态或实例方法。
(VES 是虚拟执行系统;CLR 是微软对 VES 的实现。)