转作者信息:
非余的博客
在 .NET 里,Event 实际上是通过 Delegate 实现的。例如通常使用的 EventHandler 就是一个 Delegate 类。但是由于一些代码的封装,例如 += -= 操作符的重写、event 关键字的使用,会增加理解上的难度。
我们在 Windows Form 里所写的 Form_Load、Button_Click 之类函数在本质上是用来回调的。
1. 谁来回调?被调用者。对 Form_Load 来说,是当前派生出的 Form 的基类;对 Button_Click 来说,就是实例化后的
2. 何时回调?当然是由被调用者在处理到需要调用回调函数的时候了。
为什么要使用 += -= 操作符呢?这是因为我们所写的所有 Delegate 都是从 MulticastDelegate 派生出来的,而 MulticastDelegate 意味着在回调时可以通过 Delegate
Worker worker = new Worker();
worker.WorkEventHandler = (Worker.MyEventHandler)Delegate.Combine(worker.WorkEventHandler, new Worker.MyEventHandler(this.CallEventHandler1));
worker.WorkEventHandler = (Worker.MyEventHandler)Delegate.Combine(worker.WorkEventHandler, new Worker.MyEventHandler(this.CallEventHandler2));
这样写的确有些麻烦,所以编译器通过提供 += -= 的重写来简化编码。示例代码如下(实际上等同于上面的代码):
Worker worker = new Worker();
worker.WorkEventHandler += new Worker.MyEventHandler(this.CallEventHandler1);
worker.WorkEventHandler += new Worker.MyEventHandler(this.CallEventHandler2);
至于 event 关键字,实际上不使用它回调功能仍然可以正常工作。使用它的目的主要在于做出标识,供 IDE 和编译器识别。
如果使用 event 来定义 Delegate 的话,在编译时会强制你使用 += -= 操作符来管理 Delegate 链(使用 Combine 或 Remove 会导致编译错误)。示例代码如下:
public delegate void MyEventHandler(object sender, EventArgs e);
public event MyEventHandler WorkEventHandler;