理解事件

在传统编程术语中,事件是一种回调,让您能够将方法作为参数传递给另一个方法。
在C#中,这些回调被称为委托。
事件处理程序不过是通过委托调用的方法。

订阅和取消订阅

要响应另一个类发布的事件,可订阅它:定义一个事件处理程序,其签名与事件的委托签名匹配;然后使用加法赋值运算符(+ =)将事件处理程序与事件相关联。
常见的就是窗口应用。

  1. var timer = new Timer(1000);
  2. timer.Elapsed += new ElapsedEventHandler(TimerElapsedHandler);
  3. void TimerElapsedHandler(object sender,ElapsedEvenArgs e)
  4. {
  5. MessageBox.show("The timer has expired.");
  6. }

第一个参数总是名为sender,其类型为object,它表示引发事件的对象;
第二个参数是传递给事件处理程序的数据,名为e,其类型为 EventArgs或从EventArgs派生而来的类型。事件处理程序的返回类型总是为void。

委托

委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。
引用可在运行时被改变。

声明委托(Delegate)

  1. public delegate int MyDelegate (string s);
  2. delegate <return type> <delegate-name> <parameter list>

实例化委托

  1. public delegate void printString(string s);
  2. printString ps1 = new printString(WriteToScreen);
  3. printString ps2 = new printString(WriteToFile);

事件

声明事件

在类的内部声明事件,首先必须声明该事件的委托类型。例如:

  1. public delegate void BoilerLogHandler(string status);

然后,声明事件本身,使用 event 关键字:
基于上面的委托定义事件

  1. public event BoilerLogHandler BoilerEventLog;

发布事件

类和结构都可发布事件(虽然事件通常用于类中),为此只需使用简单的事件声明。
事件一般委托于EventHandler和EventHandler< T >。

这些委托是在.Net Framework中预定义的,专门用于定义事件。
EventHandler< T >是泛型委托
事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为 发布器(publisher) 类。
其他接受该事件的类被称为 订阅器(subscriber)类。
事件使用发布-订阅(publisher-subscriber)模型。

发布器(publisher)

是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。

订阅器(subscriber)

是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)