csharp:事件

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

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

该主题尚不存在

您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。

  • csharp/事件.1764218558.txt.gz
  • 最后更改: 2025/11/27 12:42
  • 张叶安