(来自我在 Essential C# 4.0 中读到的内容)
基本上,来自这个 C# 代码:
public class CustomEventArgs: EventArgs {…}
public delegate void CustomEventHandler(object sender, CustomEventArgs a);
public event CustomEventHandler RaiseCustomEvent;
编译器将生成(大致)等效于以下 C# 代码的 CIL 代码:
public delegate void CustomEventHandler(object sender, CustomEventArgs a);
private CustomEventHandler customEventHandler; // <-- generated by the compiler
public void add_CustomEventHandler(CustomEventHandler handler) {
System.Delegate.Combine(customEventHandler, handler);
}
public void remove_CustomEventHandler(CustomEventHandler handler) {
System.Delegate.Remove(customEventHandler, handler);
}
public event CustomEventHandler customEventHandler {
add { add_customEventHandler(value) }
remove { remove_customEventHandler(value) }
}
复制事件时,实际上是复制了private CustomEventHandler customEventHandler。由于委托是不可变的,所以在修改原始customEventHandler 时不会影响副本。你可以试试这段代码看看我的意思:
string s1 = "old";
string s2 = s1;
s1 = "new"; // s2 is still "old"
关于生成的 CIL 的另一个需要注意的重要特征
代码是 event 关键字的 CIL 等效项保留在 CIL 中。
换句话说,事件是 CIL 代码可以识别的东西
明确的;它不仅仅是一个 C# 构造。通过保留等效的event
CIL 代码中的关键字,所有语言和编辑器都能够提供
特殊功能,因为他们可以将事件识别为特殊
班级成员。
我猜你很困惑主要是因为你认为 event 是一个类的糖语法,对吧?