事件内部:在.net中,事件如何在内部表示?

Jee*_*van 3 .net c#

我有一个基本的疑问.内部如何将事件表示为方法或(字段)对象.如果event是一个字段,那么如何在接口定义中仍然包含事件.

谢谢JeeZ

the*_*oop 6

如果你输入:

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)

事件类似于财产; 围绕委托的包装器,只允许添加或删除方法.这样您就无法完全重新分配代理并删除其他人的订阅.

在接口中指定事件时,您所做的就是任何实现类都应该具有事件的方法addremove方法.事实上,非常类似于在接口上声明属性.

这也是为什么你只能在它声明的类中调用或重新分配事件的原因 - MyEvent对类中事件的任何引用都被重新路由以直接使用委托,而在类之外你只能访问addremove方法,而不是代表直接.