4.12 事件
知识点讲解:光盘:视频\PPT讲解(知识点)\第4章\事件.mp4
事件在编程中很常见,就是触发一个动作后执行的程序,这个执行程序是可以预设的。例如,执行按下按键这个动作之后,可以弹出一个对话框,这个弹出的对话框就是预设的程序。C#中的事件是类和对象对外发出的信息,声明某行为或某处理的条件已经成立。触发事件的对象被称为事件的发送者,捕获并响应事件的对象被称为事件的接收者。
4.12.1 声明事件
在C#中,使用event关键字声明事件,语法格式如下。
修饰符 even 事件类型 事件名;
在声明事件成员的类中,事件的行为和委托类型的字段及其相似。事件存储对某一个委托的引用,此委托表示已经添加到该事件的事件处理方法中。如果没有添加事件的处理方法,则此事件的值为null。
另外,事件也可以使用访问器的形式来访问,语法格式。
修饰符 even 事件类型 事件名;
{
add
{
语句块
}
remove
{
语句块
}
}
C#事件使用修饰符的和方法的声明原则相同,事件也分为静态事件、虚事件、密封事件、重写事件和抽象事件。在上述语法格式中的事件类型必须是委托类型,并且此委托类型必须至少具有和事件本身一样的可访问性。
事件和方法具有一样的签名,签名包括名称和对应的参数列表。事件的签名通常使用委托来定义,例如下面的代码。
public delegate void mm(object s,System.EventArgs t);
C#事件的主要特点如下。
- 事件是类用来通知对象需要执行某种操作的方式。
- 事件一般在图形操作界面中响应用户的操作。
- 事件通常使用委托来声明。
- 事件可以调用匿名方法实现。
在.NET框架的事件签名中,第一个参数通常是触发事件的发送者,第二个参数是第一个传送与事件相关的数据的类。
如果在声明事件时没有采用访问器的方式,编译器将自动提供访问器。
事件可以作为“+=”运算符左边的操作数,它将被用于将事件处理方法添加到所涉及的事件中,或从事件中删除事件的处理方法。
4.12.2 使用事件
事件功能是由如下3个关联元素实现的。
- 提供事件数据的类,即类EventNameEventArgs,此类从System.EventArgs中导出。
- 事件委托,即EventNameEventHandler。
- 引发事件的类,此类提供事件声明和引发事件的方法。
在现实应用中,通常是调用委托来引发事件,并传递与事件相关的参数。委托将调用已经添加到该事件的所有处理方法。如果没有事件处理方法,则该事件为空。
如果要使用在另外一个类中定义的事件,则必须定义和注册一个事件的处理方法。
每个事件都可以分配多个处理程序来接收事件。这样事件将自动调用每个接收器,无论接收器有几个,引发事件只需调用一次该事件即可。
在C#类中实现事件处理的操作步骤如下。
(1)定义提供事件数据的类。对类EventNameEventArgs进行重命名处理,从System.EventArgs派生后添加所有事件的成员。
(2)声明事件的委托,即对委托EventNameEventHandler进行重命名处理。
(3)使用关键字event在类中定义名为EventName的公共事件成员,并将事件的成员设置为委托类型。
(4)在引发事件的类中定义一个受保护的方法。一般是protected类型的virtual方法。
(5)在引发事件的类中确定引发该事件的事件,即调用OnEventName来引发该事件,然后使用EventNameEventArgs传入事件特定的数据。
如果是在另外一个类中实现事件处理,则具体的实现过程如下。
(1)在使用事件的类中定义一个与事件委托有相同签名的事件处理方法。
(2)使用对该事件处理方法的一个引用创建委托的实例,当调用此委托实例时会自动调用该事件的处理方法。
(3)使用“+=”操作符将该委托实例添加到事件。
(4)如果不需要事件处理,则使用“− =”操作符将该委托从事件队列中删除。