新闻中心

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

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

c# 如何定义和触发事件_c# 事件定义与触发方法指南

在 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 创建自定义参数类。

Whimsical Whimsical

Whimsical推出的AI思维导图工具

Whimsical 182 查看详情 Whimsical 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# 程序。

以上就是C# 如何定义和触发事件_C# 事件定义与触发方法指南的详细内容,更多请关注其它相关文章!


# 抽象类  # 松北区建设局网站  # 剪映营销推广视频哪里进  # 汉服店的营销推广  # 短视频推广与营销  # 高粱seo技巧  # 敦煌网站推广网站建设  # 营口企业seo优化优势  # 小红书营销推广的特点  # 东港网站推广包年优惠  # 海外硕博网站建设  # 长时间  # ai  # 有哪些  # 是一种  # 是在  # 这是  # 是一个  # 游戏开发  # 运算符  # 自定义  # gate  # .net  # c# 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道  windows10怎么关闭系统提示音_windows10彻底静音设置方法  Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】  age动漫网站入口 age动漫官网直接访问入口  html5 app怎么运行环境_配html5 app运行环境【教程】  PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract  qq游戏大厅官方下载_qq游戏免费下载安装入口  PySpark中从现有列右侧提取可变长度字符创建新列的教程  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  React项目中导航栏Logo自适应布局:避免裁剪与布局溢出  蛙漫安全无毒 官方认证的绿色入口  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  Go语言HTML解析:利用Goquery精准获取指定元素内容  Django表单验证失败时保留用户输入数据的最佳实践  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  汽车之家官方网站官网入口_汽车之家网页版直接进入  J*aScript异步迭代器_j*ascript异步遍历  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  Animex动漫社网入口地址 Animex动漫社网正版在线入口  J*a递归快速排序中静态变量导致数据累积问题的解决方案  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问  优化HTML表单样式:解决输入框焦点跳动与元素间距问题  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  AO3官方在线访问地址 Archive of Our Own最新镜像合集  j*a toString()的覆盖  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  c++20的std::jthread是什么_c++可中断线程与RAII式管理  在Typer应用中优雅地处理和重组任意命令行参数  Python自定义类排序:解决lambda键值访问TypeError的实践指南  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  Python字典中优雅地迭代剩余元素的方法  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  邮政快递包裹最新位置 邮政快递实时追踪入口  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  Golang指针如何与map组合使用_Golang map指针组合实践  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  c++ dfs和bfs代码 c++深度广度优先搜索算法  J*aScript中针对特定容器内图片动画的实现教程  特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相  解决Bootstrap卡片顶部边距导致背景图下移的问题  C++如何解决segmentation fault_C++段错误调试与原因分析 

搜索