委托和事件关键字在哪里定义?

时间:2013-09-08 18:19:01

标签: .net

我在我的机器上安装了Jetbrains dotpeek,我用它来查看.net类型的定义方式。大多数类型通常属于mscorlib.dll,system.dll和其他一些dll。我试图找到如何在.net BCL中定义委托和事件关键字,但我无法在任何dll中找到它。我也找不到任何在线文档来揭示它的定义。有人能告诉我委托和事件关键字在哪里定义?

1 个答案:

答案 0 :(得分:1)

认为这个问题表明你不了解C#,。Net,IL和CLR之间的关系。我建议你先阅读。

C#语言的所有关键词都是:语言的关键字。它们在任何DLL或CLR中都没有任何表示形式(至少不是直接)。只有C#编译器关心C#关键字,它们会影响IL产生的内容。

如果您反编译DLL,则可以看到类型的代码,因为delegateevent关键字不代表类型(例如intdecimalstring做),你不会在任何DLL中找到它们。

如果您想了解有关IL的详细信息,请查看ECMA 335,这是其规范。

如果你看那里,你会发现在IL中,event只是两个(或更多)方法的集合(§II.18),这就是C#event关键字编译的内容。

所以,如果你写代码如下:

public event EventHandler SomeEvent
{
    add { /* some code */ }
    remove { /* more code */ }
}

然后C#编译器发出两个方法和一个由这些方法组成的事件。如果你自己不编写addremove的代码(这是常见的情况,它被称为“类字段事件”),那么C#编译器会为你生成它,以及支持字段(和代码is not that simple)。

delegate关键字以有趣的方式运行。根据IL specicifcation(§I.8.9.3),委托是一个派生自System.Delegate的特殊类,并且有一个名为Invoke的方法。该方法的代码由CLR提供,因此如果您反编译一些委托类型,则不会看到任何内容。这正是C#关键字delegate的作用:如果您使用它,编译器会发出符合上述条件的类。