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