1
第 9章 代表和事件
9.1 代表
9.2 事件
2
9.1.1 代表的声明与使用
代表是一种引用数据类型,其作用相当于
C/C++语言中的函数指针。
代表实际上是定义了一个派生于
System.Delegate的类。
使用代表的程序结构是:
( 1)声明一个代表。
( 2)代表的实例化。
( 3)使用代表。
3
1.代表的声明
代表的声明格式为:
[特征 ] [修饰符 ] delegate 返回类型 代表名 ([参数表 ]);
代表并不知道也不关心它所引用的对象类,
任何对象都可以,只要方法的参数类型以及返回类型(即方法的签名)与代表中的类型相匹配即可。
2.代表的实例化
其格式为:
new 代表名 (表达式 );
其中,表达式可以是三种类型:静态方法、
实例方法和其他的代表对象。
4
3.代表的调用
代表对象的调用规则与直接使用它所封装的方法一致,代表对象名被当作是方法名使用,然后提供封装方法所需要的参数。
4.代表的 callback方法(回调方法)
callback方法用于许多目的,其中最常用的有:
异步处理
把用户代码放入一个类的代码路径中。
5
9.1.2 多重代表
多重代表( multicast delegate)即通过一个代表调用两个或更多实现方法。
任何返回值为 void的代表都是多重代表。
多重代表具有创建方法链表的能力。
方法链表中的方法必须具有相同的参数,而且这些方法的返回类型必须定义为 void。
6
9.1.3 静态代表
C#允许把代表定义为静态的类成员,以便在创建代表时使用。
这个静态成员可以用于 Main()方法,而无需用户对代表进行实例化。
7
9.1.4 代表构成
构成代表的能力(从多重代表创建出单个代表)在一开始的时候并不一定能让用户感到方便,但其实它是非常有用的。
8
9.1.5 代表的异常处理
如果在调用代表对象时,在某个方法中产生异常,且该方法没有进行异常处理,则可以由调用的代表对象的方法来处理。
对于多重代表,在方法链表中某一个方法发生异常后将进行异常处理,并终止代表对象调用链表中后续方法的调用。
返回目录
9
9.2.1 事件的创建和使用
C#语言创建和使用事件的步骤为:
1.为事件创建一个代表
为事件声明一个代表的语句格式为:
delegate void 代表名 ([触发事件的对象名,事件参数 ]);
2.创建一个包含事件信息的类
事件信息将作为事件参数发送给事件接收者。
创建的这个类将包含事件处理方法需要的所有数据,这些数据以后将被传递给事件处理方法。
10
3.创建事件类(包含事件成员的类)
可以创建一个引发事件的类,它包含事件的声明。事件声明的格式为:
[特征 ] [修饰符 ] event 代表名 事件名;
4.创建事件处理程序
事件处理程序是一个代码片段,在事件被触发时,将通过该事件的代表来调用处理该事件的事件处理方法,处理事件的方法是用事件代表的格式创建的。
11
5.将事件处理程序和事件关联起来
关联过程是在主程序中进行的。
首先必须声明一个包含事件的对象。
然后将事件处理程序和该对象关联起来,
其格式如下:
事件类对象名,事件类中定义的事件成员 +=
new 事件代表名(事件处理方法名列表);
12
9.2.2 事件访问器
事件访问器的声明包括两种:添加( add)访问器声明和删除( remove)访问器声明,并在访问器声明之后跟随相关执行代码的语句块。
在执行预订操作时使用添加访问器,在执行撤消操作时使用删除访问器。
不管是哪种事件访问器,都对应相应的一个方法,这个方法只有一个事件类型的值参数,
并且返回值为 void。
13
9.2.3 多重事件
一个事件可以链接多个代表对象来响应事件信息,也可以为同一个事件指定多个事件处理程序(新加入的处理程序必须有同样的格式),此时可以使用,+=”或,-=”运算符。
返回目录