我们抛弃各种 C#参考书中桀骜难懂的事件与委托概念,设想一个情景来理解事件与委托
的使用:有一家 IT 公司,董事长不希望自己的雇员在上班时间玩游戏,但又不可能每时每
刻都盯着每个雇员,因此,他希望使用一种新的方式实现监视雇员的效果:如果有雇员违
反规定,某个设备或专门的监查人员将自动发出一个消息通知他,董事长只需要在事情发
生时进行处理。
因此,这个用例实际上是两种类型——董事长类与雇员类——之间的交互,下面的代码将
给读者展示如何使用委托与事件机制实现这种交互:
首先,我们需要在董事长类与雇员类之间定义一个委托类型,用于传递两者之间的事件,
这个类型就是一个监视设备或专门负责打小报告的监查人员:
public delegate void DelegateClassHandle();
定义一个委托的过程类似方法的定义,但它没有方法体。定义委托一定要添加关键字
delegate。由于定义委托实际上相当一个类,因此可以在定义类的任何地方定义委托。另
外 , 根 据 委 托 的 可 见 性 , 也 可 以 添 加 一 般 的 访 问 修 饰 符 , 如 public 、 private 和
protected。
委托的返回值类型为 void,这并非表示委托类型本身带有返回值,该返回值类型是指委托
的目标函数类型,即它委托的一个事件处理函数返回值是 void 类型。
新建一个雇员类 Employee,其代码如下:
public class Employee
{
public event DelegateClassHandle PlayGame;
public void Games()
{
if (PlayGame != null)
{
PlayGame();
}
}
}
雇员类 Employee 代码中定义了一个 DelegateClassHandle 类型的事件 PlayGame,
它的定义方式也很特殊,首先必须使用关键字 event,表示 PlayGame 是一个事件,同时
还必须声明该事件的委托类型为 DelegateClassHandle,即将来由该类型的委托对象负
责通知事件。
如果有雇员开始玩游戏,它将执行 Games 方法,而只要该方法一被调用,就会触发一个
事件 PlayGame,然后董事长就会收到这个事件的消息——有人在玩游戏了。
董事长类代码如下,他有一个方法 Notify 用于接收消息:
public class Admin
{
public void Notify()