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



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

我认为这个问题表明你不了解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# 编译器发出两个方法和一个由这些方法组成的事件。如果您不编写代码add并自己remove(这是常见情况,称为"类字段事件"),则 C# 编译器会为您生成代码以及支持字段(代码不是那么简单)。

delegate关键字的行为方式很有趣。根据 IL 规范 (§I.8.9.3),委托是一个派生自 System.Delegate 的特殊类,具有称为 Invoke 的方法。该方法的代码由 CLR 提供,因此,如果反编译某些委托类型,则不会在其中看到任何内容。这正是 C# 关键字 delegate 的作用:如果使用它,编译器会发出满足上述条件的类。

相关内容

最新更新