如果你输入:
public event EventHandler MyEvent;
Run Code Online (Sandbox Code Playgroud)
编译器生成的是(简化)这个:
// declares a normal delegate of type 'EventHandler'
private EventHandler _myEvent;
// declares 'add_MyEvent' and 'remove_MyEvent' methods similar to a property
public event EventHandler MyEvent {
add { _myEvent += value; }
remove { _myEvent -= value; }
}
Run Code Online (Sandbox Code Playgroud)
事件类似于财产; 围绕委托的包装器,只允许添加或删除方法.这样您就无法完全重新分配代理并删除其他人的订阅.
在接口中指定事件时,您所做的就是任何实现类都应该具有事件的方法add和remove方法.事实上,非常类似于在接口上声明属性.
这也是为什么你只能在它声明的类中调用或重新分配事件的原因 - MyEvent对类中事件的任何引用都被重新路由以直接使用委托,而在类之外你只能访问add和remove方法,而不是代表直接.