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

.net 委托和事件关键字在哪里定义?,.net,.net,我已经安装在我的机器上,我用它来窥视.net类型的定义方式。大多数类型通常位于mscorlib.dll、system.dll和一些其他dll之下。我试图找到如何在.net BCL中定义委托和事件关键字,但我无法在任何dll中找到它。我也找不到任何在线文档显示它的定义。有人能告诉我委托和事件关键字是在哪里定义的吗?我认为这个问题表明您不了解C#、.Net、IL和CLR之间的关系。我建议你先仔细阅读一下 C#语言的所有关键字都只是:语言的关键字。它们在任何DLL或CLR中都没有任何表示(至少不是直接

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

我认为这个问题表明您不了解C#、.Net、IL和CLR之间的关系。我建议你先仔细阅读一下

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


如果反编译DLL,您可以看到类型的代码,并且由于
委托
事件
关键字不表示类型(例如
int
十进制
字符串
do),因此您无法在任何DLL中找到它们

如果您想了解IL的详细信息,请查看,这是它的规范

如果你看一下,你会发现在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#keyword
delegate
所做的:如果使用它,编译器会发出一个满足上述条件的类。

当然,在解析器(语言语法)中,
delegate
event
是语言的关键字,而不是类型。它们用于声明作为委托和事件的类型。因此,您不会在BCL中找到它们。您可以在语言引用中找到它们。可以公平地说CLR不需要引用任何dll就可以知道委托是什么吗?委托/事件的定义在CLR dll中?@Foo不,这是不公平的。委托是第一类对象,其中很大一部分由CLI本身(作为外部对象)提供。委托类型来自一个核心lib,但CLI在管道中非常活跃。但是:CLI不需要绑定到任何特定的委托基类型实现,只需要:整个模式。