差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 后一修订版 | 前一修订版 | ||
| csharp:事件 [2025/11/27 12:42] – 创建 张叶安 | csharp:事件 [2025/11/27 12:45] (当前版本) – [总结] 张叶安 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | ====== | + | ====== 事件 (Events) ====== |
| 事件 (Event) 是 C# 中非常核心但也相对难以理解的概念。它是类与类之间通信的重要机制。 | 事件 (Event) 是 C# 中非常核心但也相对难以理解的概念。它是类与类之间通信的重要机制。 | ||
| - | ===== 95-1:事件简介 ===== | + | ===== 事件简介 ===== |
| **什么是事件?** | **什么是事件?** | ||
| 行 12: | 行 12: | ||
| * 这种通知的操作称为 **引发事件 (Raising an Event)**。 | * 这种通知的操作称为 **引发事件 (Raising an Event)**。 | ||
| - | <note warning> | + | |
| **为什么说事件很难理解?** | **为什么说事件很难理解?** | ||
| 很多初学者容易混淆“委托”和“事件”。 | 很多初学者容易混淆“委托”和“事件”。 | ||
| 简单来说:**事件是基于委托的**。如果把委托看作是“函数指针的容器”,那么事件就是对这个容器的一种“封装”和“保护”。 | 简单来说:**事件是基于委托的**。如果把委托看作是“函数指针的容器”,那么事件就是对这个容器的一种“封装”和“保护”。 | ||
| - | </ | + | |
| 我们可以用生活中的例子来类比: | 我们可以用生活中的例子来类比: | ||
| 行 24: | 行 24: | ||
| * **处理方法**:当水开了,水壶(发布者)发出鸣叫(通知),你(订阅者)听到后去关火(处理方法)。 | * **处理方法**:当水开了,水壶(发布者)发出鸣叫(通知),你(订阅者)听到后去关火(处理方法)。 | ||
| - | ===== 95-2:委托的发布与订阅 ===== | + | ===== 委托的发布与订阅 ===== |
| 在学习 `event` 关键字之前,我们先看看如何仅使用 **委托 (Delegate)** 来实现发布和订阅模式。这有助于理解事件的底层原理。 | 在学习 `event` 关键字之前,我们先看看如何仅使用 **委托 (Delegate)** 来实现发布和订阅模式。这有助于理解事件的底层原理。 | ||
| 行 93: | 行 93: | ||
| </ | </ | ||
| - | <note important> | + | |
| **纯委托模式的缺陷:** | **纯委托模式的缺陷:** | ||
| 在上面的代码中,`OnBoil` 是一个 `public` 字段。这意味着外部类不仅可以订阅 (`+=`),还可以: | 在上面的代码中,`OnBoil` 是一个 `public` 字段。这意味着外部类不仅可以订阅 (`+=`),还可以: | ||
| 行 99: | 行 99: | ||
| * 直接调用 (`heater.OnBoil(); | * 直接调用 (`heater.OnBoil(); | ||
| 这破坏了封装性,因此我们需要 **事件 (Event)**。 | 这破坏了封装性,因此我们需要 **事件 (Event)**。 | ||
| - | </ | ||
| - | ===== 95-3:事件的发布与订阅 ===== | + | |
| + | ===== 事件的发布与订阅 ===== | ||
| 为了解决纯委托暴露出的安全问题,C# | 为了解决纯委托暴露出的安全问题,C# | ||
| 行 112: | 行 112: | ||
| ==== 代码示例:使用 event 关键字 ==== | ==== 代码示例:使用 event 关键字 ==== | ||
| - | 我们将 | + | 我们将代码稍作修改,只需加上 `event` 关键字。 |
| <code csharp> | <code csharp> | ||
| 行 169: | 行 169: | ||
| ==== 总结 ==== | ==== 总结 ==== | ||
| - | | 特性 | 95-2:公有委托字段 (Delegate) | 95-3:事件 (Event) | + | | 特性 | 公有委托字段 (Delegate) | 事件 (Event) | |
| - | | :--- | :--- | :--- | | + | |
| | **定义方式** | `public DelegateType Name;` | `public event DelegateType Name;` | | | **定义方式** | `public DelegateType Name;` | `public event DelegateType Name;` | | ||
| | **外部订阅** | 支持 `+=` 和 `-=` | 支持 `+=` 和 `-=` | | | **外部订阅** | 支持 `+=` 和 `-=` | 支持 `+=` 和 `-=` | | ||