在 C# 中,事件(Event) 是基于委托的封装机制,用于实现对象之间的通信。可以看作是用户的一系列操作,例如点击键盘的某个按键、单击/移动鼠标等,当事件发生时我们可以针对事件做出一系列的响应,例如退出程序、记录日志等等。C# 中线程之间的通信就是使用事件机制实现的。以下是一个完整的 C# 事件(Event)经典例程,演示了事件的声明、订阅、触发以及处理的完整流程。本例程使用了 .NET 中的标准 EventHandler 委托和 EventArgs 类来构建一个简单的事件系统。

using System;

// 自定义 EventArgs 子类,用于传递额外信息
public class CustomEventArgs : EventArgs
{
    public string Message { get; set; }

    public CustomEventArgs(string message)
    {
        Message = message;
    }
}

// 发布器类:包含事件和触发逻辑
public class Publisher
{
    // 定义事件(基于 EventHandler 委托)
    public event EventHandler<CustomEventArgs> MyEvent;

    // 触发事件的方法
    protected virtual void OnMyEvent(CustomEventArgs e)
    {
        // 检查是否有订阅者
        MyEvent?.Invoke(this, e);
    }

    // 模拟事件触发条件
    public void DoSomething()
    {
        Console.WriteLine("Publisher: 正在执行操作...");
        CustomEventArgs args = new CustomEventArgs("事件被触发!");
        OnMyEvent(args); // 触发事件
    }
}

// 订阅器类:提供事件处理方法
public class Subscriber
{
    public string Name { get; set; }

    // 构造函数中可以传入订阅器名称
    public Subscriber(string name)
    {
        Name = name;
    }

    // 事件处理方法,必须符合 EventHandler 的签名
    public void HandleEvent(object sender, CustomEventArgs e)
    {
        Console.WriteLine($"{Name}: 收到事件消息 - {e.Message}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 创建发布器和订阅器实例
        Publisher publisher = new Publisher();
        Subscriber subscriber1 = new Subscriber("订阅器A");
        Subscriber subscriber2 = new Subscriber("订阅器B");

        // 注册事件处理程序(订阅事件)
        publisher.MyEvent += subscriber1.HandleEvent;
        publisher.MyEvent += subscriber2.HandleEvent;

        // 执行操作以触发事件
        publisher.DoSomething();

        // 可选:取消订阅
        publisher.MyEvent -= subscriber1.HandleEvent;

        // 再次触发事件,验证订阅是否成功移除
        Console.WriteLine("\n第二次调用:");
        publisher.DoSomething();
    }
}

输出结果:

Publisher: 正在执行操作...
订阅器A: 收到事件消息 - 事件被触发!
订阅器B: 收到事件消息 - 事件被触发!

第二次调用:
Publisher: 正在执行操作...
订阅器B: 收到事件消息 - 事件被触发!

程序说明:

  1. 自定义 EventArgsCustomEventArgs 继承自 EventArgs,用于在事件中传递自定义数据。

  2. 发布器类 Publisher

    • 使用 event 关键字定义事件 MyEvent,其类型为泛型 EventHandler<CustomEventArgs>

    • OnMyEvent 方法用于安全地触发事件。

    • DoSomething() 是模拟事件触发的方法。

  3. 订阅器类 Subscriber

    • 提供了一个与事件匹配的处理方法 HandleEvent

  4. 主程序逻辑

    • 实例化发布器和两个订阅器。

    • 使用 += 运算符将订阅器的处理方法注册到事件上。

    • 调用 DoSomething() 来触发事件,并观察输出结果。

    • 展示如何通过 -= 运算符取消订阅。

更多推荐