C#语言学习笔记24 —— 事件(Event)的使用

C#语言学习笔记24 —— 事件(Event)的使用

编码文章call10242025-08-18 3:58:142A+A-

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 基于委托模型,委托模型遵从观察者设计模式。

这里简单介绍了事件的定义、订阅与取消订阅事件、使用事件、事件访问器等基本方法。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4