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. 为什么要用事件

  1. 防止外部随意置空委托 外部不能直接 = 赋值,避免覆盖已有订阅。
  2. 防止外部随意调用委托 外部不能直接 Invoke(),只能订阅或取消订阅。
  3. 增强安全性和可维护性 事件保证了发布-订阅模式的正确性,使模块之间解耦。

posted @ 2025-12-10 14:50  高山仰止666  阅读(14)  评论(0)    收藏  举报