LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 委托与事件:从原理到实战,一文搞懂!

admin
2026年2月10日 23:7 本文热度 62

在 C#编程中,委托(Delegate)和事件(Event)是实现 “松耦合” 编程的核心利器,也是新手容易混淆的知识点。小到按钮点击响应,大到分布式系统的消息通知,都离不开它们的身影。今天我们就从底层原理到实际应用,彻底搞懂委托和事件!

一、先搞懂:委托(Delegate)到底是什么?

1. 委托的本质:类型安全的 “函数指针”

你可以把委托理解为一个 “能装方法的容器”—— 它定义了方法的签名(返回值 + 参数列表),只要方法的签名和委托匹配,就能被 “装进” 这个容器里。

和 C/C++ 的函数指针不同,C# 委托是类型安全的:编译器会严格检查方法的签名是否匹配,避免了指针越界、类型不匹配等问题;同时委托是引用类型,底层封装了方法的调用逻辑,还支持多播(一个委托装多个方法)。

2. 委托的核心原理

  • 委托本质是 C#编译器自动生成的密封类,继承自System.MulticastDelegate(最终继承System.Delegate);
  • 每个委托实例会包含两个核心信息:方法的引用(Target)、方法的地址(Method);
  • 多播委托通过 “调用列表”(Invocation List)存储多个方法,执行时按顺序调用。

3. 委托的基础使用(三步上手)

第一步:定义委托(规定 “容器” 能装什么样的方法)

第二步:定义匹配签名的方法
第三步:创建委托实例并调用

4. 委托的常用场景

  • 回调函数:比如异步操作完成后执行指定方法;
  • 自定义排序:List.Sort() 可传入委托指定排序规则;
  • 多播通知:一个事件触发多个处理逻辑。

二、事件(Event):委托的 “安全封装”

事件本质是委托的特殊封装,它解决了委托直接暴露时的 “安全性问题”—— 比如外部代码可以随意替换委托的调用列表,甚至直接调用委托,破坏封装性。

1. 事件的核心原理

  • 事件基于委托实现,只能在定义它的类内部触发,外部只能通过+=/-=订阅 / 取消订阅;
  • 编译器会为事件自动生成私有的委托字段,以及公有的add/remove方法,限制外部操作。

2. 事件的使用(以 “用户注册” 为例)

第一步:定义委托(事件的 “签名规则”)

第二步:定义包含事件的类
第三步:订阅并触发事件
输出结果:

3. 事件的 “不可做”(核心安全特性)

外部代码无法直接赋值、调用事件,比如以下操作都会报错:

三、委托 vs 事件:核心区别

四、实战场景:WinForm 按钮点击(事件的典型应用)

日常开发中,你可能早已用过事件却没察觉 —— 比如 WinForm 的按钮点击:

五、总结:核心要点

1.委托

是 “装方法的类型安全容器”,支持多播,本质是编译器自动生成的类,可封装任意匹配签名的方法;

2.事件

是委托的 “安全封装”,仅开放订阅 / 取消订阅,禁止外部直接调用或赋值,是实现 “发布 - 订阅” 模式的核心;

3.委托和事件的核心价值

松耦合:发布者(触发方)无需知道订阅者(处理方)的具体实现,只需遵守委托签名即可。​

掌握委托和事件,你就能写出更灵活、可扩展的 C# 代码 —— 比如自定义控件、消息通知系统、插件化架构等,都离不开这对 “黄金搭档”!


阅读原文:原文链接


该文章在 2026/2/11 10:01:34 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved