C#事件
1. 什么是事件(Event)
- 事件是基于委托的一种特殊类型。
- 事件可以看作是对委托的 安全封装,让委托的使用更加安全。
- 本质上,事件是一个特殊的成员变量类型,用于通知订阅者某些事情发生。
事件常用于:回调机制、UI更新、系统通知等场景。
2. 事件的声明与使用
2.1 声明语法
// 声明事件
public event Action myEvent;
public event Func<int> myEvent;
- 必须是类、接口或结构体的成员
- 事件类型通常是委托类型(Action/Func 或自定义委托)
2.2 与普通委托的区别
| 特性 | 委托 | 事件 |
|---|---|---|
| 类外能赋值 | ✅ 可以 | ❌ 不允许 |
| 类外能调用 | ✅ 可以 | ❌ 不允许 |
| 主要作用 | 存储方法引用 | 安全通知订阅者 |
事件只能在声明它的类内部调用,外部只能订阅或取消订阅(
+=/-=)。
2.3 使用示例
class Monster
{
// 事件声明
public event Action deadDoSomething;
public void Die()
{
Console.WriteLine("怪物死亡");
// 内部触发事件
OnDie?.Invoke();
}
}
class Player
{
public void GainMoney()
{
Console.WriteLine("玩家获得金币");
}
}
class Program
{
static void Main()
{
Monster monster = new Monster();
Player player = new Player();
// 外部只能订阅事件
monster.deadDoSomething += player.GainMoney;
// 触发事件
monster.Die();
// 外部无法直接赋值或调用事件
// monster.deadDoSomething = null; // ❌ 错误
// monster.deadDoSomething = monster.deadDoSomething + player.GainMoney; // ❌ 错误
// monster.deadDoSomething?.Invoke(); // ❌ 错误
}
}
3. 为什么要用事件
- 防止外部随意置空委托 外部不能直接
=赋值,避免覆盖已有订阅。 - 防止外部随意调用委托 外部不能直接
Invoke(),只能订阅或取消订阅。 - 增强安全性和可维护性 事件保证了发布-订阅模式的正确性,使模块之间解耦。

浙公网安备 33010602011771号