委托和事件
定义类的事件:类可以通过事件通知外界自己正在做什么,如类中某个变量发生变化等。事件是一种函数回调机制,他通过委托来实现函数的回调。
使用事件时,先要在需要上报的类中声明一个事件,通常包含一些两个步骤:
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
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
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

浙公网安备 33010602011771号