事件基于委托,为委托提供了一种发布/订阅机制。在Windows应用程序中Button类提供了Click事件。触发Click事件时调用的处理程序方法需要定义,其参数由委托类型定义。
MSDN中对事件(event)的解释如下:类或对象可以通过事件向其它类或对象通知发生的相关事情。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。
C#中使用事件需要如下步骤:
(1)创建一个委托
(2)将创建的委托与特定事件关联(.NET类库中的很多事情都是已经定制阿红的,所以它们也就有相应的一个委托,在编写关联事件处理程序的时候我们需要和这个委托有相同的签名)
(3)编写事件处理程序
(4)把这个委托实例添加到产生事件对象的事件列表中去(这个过程叫事件订阅)
下面来看一个处理输出字符的事件的实例:
保存事件信息的类
namespace ConsoleApplication.EventDemo { /* * EventArgs是包含事件数据的类的基类,此类不包含事件数据,在事件引发时不向事件处理程序传递状态信息的事件会使用此类。 * 如果事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据。 */ /// <summary> /// 因为在我们键盘按键事件中要包含按键信息,所以要派生一个KeyEventArgs类, /// 来保存按键信息,好让后面知道按了哪个键。 /// </summary> class KeyEventArgs : EventArgs { private char keyChar; public char KeyChar { get { return keyChar; } } public KeyEventArgs(char keyChar) : base() { this.keyChar = keyChar; } } }事件发行者
namespace ConsoleApplication.EventDemo { /// <summary> /// 事件发生的类KeyInputMonitor,这个类用于监控键盘按键的输入并触发一个事件 /// </summary> class KeyInputMonitor { //(1)创建一个委托,一般都是两个参数一个Object类型,一个继承与EventArgs的类型 public delegate void KeyDownHandler(Object sender, KeyEventArgs e); //(2)将创建的委托和特定事件关联,在这里特定的事件为KeyDown public event KeyDownHandler KeyDown; public void Run() { char keyChar = (char)Console.Read(); KeyEventArgs KeyEventArgs = new KeyEventArgs(keyChar); //触发事件,并将事件交由KeyDownHandler这个委托来处理 //参数this是指触发事件的对象就是本身这个对象,keyEventArgs包含了按键信息。 KeyDown(this, KeyEventArgs); } } }
namespace ConsoleApplication.EventDemo { /// <summary> /// 事件接收方的类,这个类先产生一个委托实例, /// 再把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件。 /// 然后提供一个方法回显按键信息。 /// </summary> class EventReceiver { //(3)编写事件处理程序 private void OnkeyDown(Object sender, KeyEventArgs e) { //真正的事件处理函数 Console.WriteLine("您输入的是:" + e.KeyChar); } //(4)利用编写的事件处理程序生成一个委托实例 //(5)把这个委托实例添加到产生事件对象的事件列表中去 public EventReceiver(KeyInputMonitor monitor) { //产生一个委托实例并添加到KeyInputMonitor产生的事件列表中 monitor.KeyDown += new KeyInputMonitor.KeyDownHandler(this.OnkeyDown); } } }
namespace ConsoleApplication.EventDemo { /// <summary> /// 测试程序 /// </summary> class EventDemo { public static void Main() { KeyInputMonitor monitor = new KeyInputMonitor(); EventReceiver receiver = new EventReceiver(monitor); monitor.Run(); } } }