信息发布→ 登录 注册 退出

C# 如何定义和触发事件_C# 事件定义与触发方法指南

发布时间:2025-11-15

点击量:
事件基于委托,用于对象间通信。首先定义EventHandler或自定义EventArgs传递数据,通过event关键字声明事件,使用OnEventName模式触发,订阅用+=,取消用-=,注意检查null并及时取消订阅以防内存泄漏。

在 C# 中,事件(Event)是一种用于实现观察者模式的机制,常用于对象间通信,比如 UI 控件响应用户操作、服务状态变更通知等。合理定义和触发事件能让代码更灵活、解耦更好。

事件的基本定义

事件基于委托(Delegate),因此定义事件前需要先定义一个委托类型,或使用系统提供的通用委托如 EventHandlerEventHandler

以下是一个使用 EventHandler 定义事件的示例:

public class MyPublisher
{
    // 定义事件
    public event EventHandler MyEvent;

    // 触发事件的方法
    protected virtual void OnMyEvent()
    {
        MyEvent?.Invoke(this, EventArgs.Empty);
    }

    // 模拟条件满足时触发事件
    public void DoSomething()
    {
        // 执行某些逻辑
        Console.WriteLine("执行操作...");
        // 触发事件
        OnMyEvent();
    }
}

自定义事件参数

如果需要传递额外数据,可以继承 EventArgs 创建自定义参数类。

public class MyEventArgs : EventArgs
{
    public string Message { get; set; }

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

然后在类中使用泛型事件:

public class MyPublisher
{
    public event EventHandler CustomEvent;

    protected virtual void OnCustomEvent(string msg)
    {
        CustomEvent?.Invoke(this, new MyEventArgs(msg));
    }

    public void TriggerCustomEvent()
    {
        OnCustomEvent("这是自定义消息");
    }
}

订阅与取消订阅事件

其他类可以通过 += 订阅事件,用 -= 取消订阅。

class Program
{
    static void Main()
    {
        var publisher = new MyPublisher();

        // 订阅事件
        publisher.MyEvent += HandleMyEvent;
        publisher.CustomEvent += HandleCustomEvent;

        publisher.DoSomething();
        publisher.TriggerCustomEvent();

        // 取消订阅
        publisher.MyEvent -= HandleMyEvent;
    }

    static void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("MyEvent 被触发");
    }

    static void HandleCustomEvent(object sender, MyEventArgs e)
    {
        Console.WriteLine($"收到消息: {e.Message}");
    }
}

注意事项与最佳实践

  • 始终在触发事件前检查是否为 null,或使用 null 条件运算符 ?. 避免异常
  • 将触发方法命名为 OnXXX 是 .NET 的命名惯例
  • 使用 virtual 方法以便派生类可重写事件触发行为
  • 记得在适当时机取消订阅,防止内存泄漏,尤其是在长时间存在的发布者中
  • 优先使用 EventHandlerEventHandler,而非自定义委托,除非有特殊需求

基本上就这些。掌握事件的定义、触发和处理方式,能帮助你写出更清晰、响应性更强的 C# 程序。

标签:# 这是  # var  # console  # 对象  # 事件  # this  # ui  # 自定义  # 是一个  # 泛型  # 是在  # 是一种  # 长时间  # 可以通过  # 能让  # 重写  # 而非  # void  # c#  # .net  # gate  # Static  # String  # Object  # NULL  # 运算符  # ai  # 继承  # class  # public  # protected  # Delegate  # 委托  # Event  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!