理解事件
在传统编程术语中,事件是一种回调,让您能够将方法作为参数传递给另一个方法。
在C#中,这些回调被称为委托。
事件处理程序不过是通过委托调用的方法。
订阅和取消订阅
要响应另一个类发布的事件,可订阅它:定义一个事件处理程序,其签名与事件的委托签名匹配;然后使用加法赋值运算符(+ =)将事件处理程序与事件相关联。
常见的就是窗口应用。
var timer = new Timer(1000);
timer.Elapsed += new ElapsedEventHandler(TimerElapsedHandler);
void TimerElapsedHandler(object sender,ElapsedEvenArgs e)
{
MessageBox.show("The timer has expired.");
}
第一个参数总是名为sender,其类型为object,它表示引发事件的对象;
第二个参数是传递给事件处理程序的数据,名为e,其类型为 EventArgs或从EventArgs派生而来的类型。事件处理程序的返回类型总是为void。
委托
委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。
引用可在运行时被改变。
声明委托(Delegate)
public delegate int MyDelegate (string s);
delegate <return type> <delegate-name> <parameter list>
实例化委托
public delegate void printString(string s);
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);
事件
声明事件
在类的内部声明事件,首先必须声明该事件的委托类型。例如:
public delegate void BoilerLogHandler(string status);
然后,声明事件本身,使用 event 关键字:
基于上面的委托定义事件
public event BoilerLogHandler BoilerEventLog;
发布事件
类和结构都可发布事件(虽然事件通常用于类中),为此只需使用简单的事件声明。
事件一般委托于EventHandler和EventHandler< T >。
这些委托是在.Net Framework中预定义的,专门用于定义事件。
EventHandler< T >是泛型委托
事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为 发布器(publisher) 类。
其他接受该事件的类被称为 订阅器(subscriber)类。
事件使用发布-订阅(publisher-subscriber)模型。
发布器(publisher)
是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。
订阅器(subscriber)
是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)