【问题标题】:Where does delegates' constructors and member functions are defined?委托的构造函数和成员函数在哪里定义?
【发布时间】:2010-10-05 08:52:59
【问题描述】:
当我在 Reflector 中查看 Action 代表时,我看到它有一个类似的构造函数
public Action(object @object, IntPtr method);
但我找不到任何相同的主体以及其他成员函数,如Invoke、BeginInvoke 等。我只能看到它的定义。这些函数是在哪里定义的?它们是在 .net BCL 之外定义的吗?
【问题讨论】:
标签:
c#
.net
delegates
reflector
【解决方案1】:
基本上,委托由 CLR 专门处理。编译器提供签名,但 CLR 知道如何处理它们。
ECMA-335分区的第8.9.3节我谈到了这个:
委托是函数指针的面向对象等价物。与函数指针不同,委托是
面向对象、类型安全和安全。委托是通过定义派生自基类型的类来创建的
System.Delegate(参见分区 IV)。每个委托类型都应提供一个名为 Invoke 的方法,并带有适当的
参数,并且委托的每个实例都将对其 Invoke 方法的调用转发给一个或多个兼容的
特定对象的静态或实例方法。它委托的对象和方法在何时被选择
委托实例已创建。
除了实例构造函数和 Invoke 方法之外,委托还可以选择另外两个
方法:BeginInvoke 和 EndInvoke。这些用于异步调用。
虽然在大多数情况下,委托似乎只是另一种用户定义的类,但它们是紧密的
受控。方法的实现由 VES 提供,而不是用户代码。唯一的额外
可以在委托类型上定义的成员是静态或实例方法。
(VES 是虚拟执行系统;CLR 是微软对 VES 的实现。)