C#语言学习笔记24 —— 事件(Event)的使用
C# 事件(Event)
概述
C# 事件(Event)能够让一个类或对象,在有关注的事情发生时,通知其它类和对象。
发送 Event 的类或对象称为发布者(publisher),也称为发送者(sender)。
接收 Event 的类或对象称为订阅者(subscribers),也称为接收者(receiver)。
事件(event)是一个委托(delegate)类型,委托里引用的方法称为事件处理程序(handler)。
在 Windows Forms、WPF 或 Web 应用中,典型地要订阅按钮、列表框等控件所引发的事件。
事件的一些特点:
- 发布者决定什么时候引发事件;订阅者决定如何对事件作响应。
- 一个事件可以有多个订阅;一个订阅者可以接收处理多个发布者的多个事件。
- 事件如果没有订阅者,不会引发。
- 事件常用在用户界面中,来指示用户的动作,如按钮、菜单项被点击等。
- 当一个事件有多个订阅者时,事件处理程序(handlers)将被同步调用。
- 在 .NET 类库里,事件基于 EventHandler 委托和 EventArgs 基类。
事件的订阅与取消
.NET 提供 EventHandler 和 EventHandler<TEventArgs> 委托类型,支持绝大多数事件场景。
不带数据的事件使用 EventHandler,原型为:
public delegate
void EventHandler(
object? sender, EventArgs e);
携带数据的事件使用泛型 EventHandler<TEventArgs>,原型为:
public delegate
void EventHandler<TEventArgs>(
object? sender, TEventArgs e);
参数说明:
第一个参数 object? sender 是引发事件的实例。
不带数据的事件版本,第二个参数 EventArgs e 的值为 EventArgs.Empty。
带数据的事件版本,第二个参数为 EventArgs 的派生类实例,如泛型类 <TEventArgs> 实例,是事件的数据。
(1)事件的订阅
使用加法赋值运算符 (+=) 来订阅事件。
比如 Form 的 Load 事件处理器:
事件的订阅代码系统帮生成:
也可以把 lambda 表达式作为事件处理程序,例如:
(2)事件的取消订阅
使用减法赋值运算符 (-=) 来取消订阅事件。
比如要取消的事件处理程序为:
订阅事件时为:
取消订阅事件时为:
自定义事件的列子
一个不带数据的自定义事件例子如下:
一个带数据的自定义事件如下:
事件访问器(event accessors)
事件访问器类似于属性访问器,不同之处在于,它不是使用 get 和 set,而是使用 add 和 remove。
在大多数情况下,无需提供自定义事件访问器。 如果代码中没有提供自定义事件访问器,编译器将自动添加它们。 但在需要的情况下,可以提供自定义行为。
例如,如果需要在订阅和取消订阅事件时加入日志,可以这样做:
在接口里使用事件
可以在接口中定义事件。
下面是一个在接口中使用事件的例子:
结束语
.NET 的 Events 基于委托模型,委托模型遵从观察者设计模式。
这里简单介绍了事件的定义、订阅与取消订阅事件、使用事件、事件访问器等基本方法。