委托和事件

定义类的事件:类可以通过事件通知外界自己正在做什么,如类中某个变量发生变化等。事件是一种函数回调机制,他通过委托来实现函数的回调。

使用事件时,先要在需要上报的类中声明一个事件,通常包含一些两个步骤:

1.定义一个委托类型(EventHandler)表示事件处理的类型;

2.在类中用event关键字声明一个EventHandler类型事件,事件具有访问性,通常为public

定义方式如下:

1 delegate void MyEventHandler(object sender,EventArgs e);
2 class EventClass
3 {
4   public event MyEventHandler MyEvent;
5 }
6 

 

说明:理论上说,事件处理函数的类型是任意的,但在C#中,事件处理函数一般不返回任何数据,带两个参数,其中一个是Ojbect类型参数sender,表示事件上报者;第二个通常为EventArgs或其子类,表示事件上报的具体参数。如鼠标单击事件,会在参数中带上鼠标单击所在位置的X,Y坐标。

 

引发类的事件

 

代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Example3
 7 {
 8     delegate void MyEventHandler(object sender,EventArgs e);//定义委托
 9     
10     class EventClass
11     {
12         public event MyEventHandler MyEvent;//用event 关键字声明一个EventHandler类型的事件,事件同样具有访问性,所以通常定义为public
13         /// <summary>
14         /// 
15         /// </summary>
16         /// <param name="e"></param>
17         protected void OnMyEvent(EventArgs e)
18         {
19             System.Console.WriteLine("EventClass:Ready to fire a MyEvent");
20             if (this.MyEvent!=null)
21             {
22                 Console.WriteLine("EventClass:fire a MyEvent!");
23                 this.MyEvent(this, e);
24             }
25         }
26 
27         public void FireAEvent()
28         {
29             this.OnMyEvent(EventArgs.Empty);
30         }
31     }
32 
33     class Program
34     {
35         static void GetAEvent(object sender,EventArgs e)
36         {
37             Console.WriteLine("GetEvent:Get a Event EventClass ");
38         }
39 
40         static void Main(string[] args)
41         {
42             EventClass ecls = new EventClass();
43             ecls.MyEvent += new MyEventHandler(GetAEvent);
44             ecls.FireAEvent();
45             ecls.MyEvent -= new MyEventHandler(GetAEvent);
46             ecls.FireAEvent();
47         }
48     }
49 }
50 

 

 

posted on 2010-03-13 19:30  晴天1848  阅读(183)  评论(0)    收藏  举报