《C#高级编程》之事件学习笔记

    引用《C#高级编程(第六版)》:

      基于Windows的程序也是基于消息的。这说明应用程序是通过Windows来通信的,Windows又是使用预定义的消息与应用程序通信的。这些消息是包含各种信息的结构,应用程序和Windows使用这些信息决定下一步的操作。在MFC等库或Visual Basic等开发环境推出之前,开发人员必须处理Windows发送给应用程序的消息。Visual Basic和今天的.NET把这些传送来的消息封装在事件中。如果需要响应某个消息,就应处理对应的事件。一个常见的例子是用户单击了窗体中的按钮后,Windows就会给按钮消息处理程序(有时称为Windows过程或WndProc)发送一个WM_MOUSECLICK消息。对于.NET开发人员来说,这就是按钮的Click事件。

  在开发基于对象的应用程序时,需要使用另一种对象通信方式。在一个对象中发生了有趣的事情时,就需要通知其他对象发生了什么变化。这里又要用到事件。就像.NET Framework把Windows消息封装在事件中那样,也可以把事件用作对象间的通信介质。

  委托就用作应用程序接收到消息时封装事件的方式。

  

  因此理解事件就得先了解这两个概念,它们是事件编程的基本部分:事件发生器(发生事件的类)和事件处理器(处理事件的类)。

  事件发生器,指的是引发了某些事件的类、应用程序或组件。

  事件接收器,指的是发生某些事件时被通知的任何应用程序、对象或组件,用于响应并处理发生器引发的事件。

  事件发生器不知道接收器会处理其发生的事件,而接收器在某个地方需要有个方法来负责处理事件。在每个发生已注册的事件时,就执行这个事件处理程序。因此就需要引入委托来实现这个功能,即让委托充当事件发生器和事件接收器之间的媒介。

  使用事件需要如下步骤:

  1)创建事件类

    2)创建事件发生器和一个委托

  3)将创建的委托与特定事件类关联

  4)编写事件接收器和事件处理程序

  5)利用编写的事件处理程序生成一个委托实例

  6)把这个委托实例添加到产生事件对象的事件列表中去,这个过程叫事件订阅

  (参考:http://www.cnblogs.com/michaelxu/archive/2008/04/02/1134217.html

  详细代码如下:  

      1、创建事件类,注意EventArgs是包含事件类的基类,此类不包含事件数据,在事件引发时不向事件处理程序传递事件的状态信息可以使用这个类,如果事件类需要使用状态信息,则应用程序需从此类派生一个类来保存状态信息。这里的事件类有两个信息EventCode和EventValue,因此需要派生出ActionEventArgs类。

1 public class ActionEventArgs:EventArgs
2 {
3 private string eventCode;
4 private string eventValue;
5
6 public ActionEventArgs(string _eventCode,string _eventValue)
7 {
8 this.eventCode=_eventCode;
9 this.eventValue=_eventValue;
10 }
11
12 public string EventCode
13 {
14 get
15 {
16 return this.eventCode;
17 }
18 set
19 {
20 this.eventCode=value;
21 }
22 }
23
24 public string EventVaue
25 {
26 get
27 {
28 return this.eventValue;
29 }
30 set
31 {
32 this.eventValue=value;
33 }
34 }
35 }

 

  2、创建事件发生器和一个委托,并将委托与特定事件关联

1 public class EventActor
2 {
3 //创建一个委托
4   public delegate void ActionEventHandle(object sender,ActionEventArgs e);
5 //将创建的委托和特定事件关联
6   public event ActionEventHandle Actor;
7
8 public void Excute()
9 {
10 string code=Console.ReadLine();
11 string value=Console.ReadLine();
12 ActionEventArgs actionEventArgs=new ActionEventArgs(code,value);
13 Actor(this,actionEventArgs);
14 }
15 }

 上面的Actor(this,actionEventArgs)用于触发事件,并将事件交由Actor这个委托处理,委托就可指定特定程序处理事件,即由事件接收器处理,this指触发事件的对象是本身,actionEventArgs包含事件的状态信息。

   

  3、编写事件接收器和事件处理程序,同时生成一个委托实例并进行事件订阅

       这个类产生一个委托实例,再把这个委托实例添加到事件发生器的事件列表里去,这就是事件订阅。 

1 public class EventReceiver
2 {
3 public EventReceiver(EventActor actEvent)
4 {
5 actEvent.Actor+=new EventActor.ActionEventHandle(this.EventResponse);
6 }
7
8 private void EventResponse(object sender,ActionEventArgs e)
9 {
10 Console.WriteLine("EventCode:{0},EventValue:{1}",e.EventCode,e.EventValue);
11 }
12 }

 

  4、程序入口

1 public class Test
2 {
3 public static void Main()
4 {
5 EventActor actor=new EventActor();
6 EventReceiver receiver=new EventReceiver(actor);
7 actor.Excute();
8 }
9 }

  

 

posted on 2011-01-04 22:34  阿寻  阅读(1089)  评论(2编辑  收藏  举报