新闻中心
.NET中委托(Delegate)和事件(Event)的用法
委托是类型安全的函数指针,用于引用方法并实现回调;事件基于委托,提供封装性更强的发布-订阅模式,只能在类内触发、外部订阅,常用于GUI交互与组件通信。

在 .NET 中,委托(Delegate) 和 事件(Event) 是实现回调机制和松耦合设计的重要工具。它们常用于异步编程、GUI 交互、观察者模式等场景。
什么是委托(Del
egate)
委托是一种类型安全的函数指针,它定义方法的签名,并可以引用具有相同签名的方法。委托允许将方法作为参数传递,也可以在运行时动态绑定方法。
声明一个委托使用 delegate 关键字:
public delegate void MyAction(string message);public delegate int Calculate(int a, int b);
然后可以实例化委托并指向具体方法:
MyAction action = new MyAction(Console.WriteLine);action("Hello World"); // 输出: Hello World
也可以使用简写方式:
MyAction action = Console.WriteLine;action("Hi");
委托支持多播(Multicast),即一个委托可绑定多个方法,使用 += 添加,-= 移除:
Reachout.ai
一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造
142
查看详情
action += (msg) => { Console.WriteLine("Logged: " + msg); };action("Test"); // 会触发两个方法
什么是事件(Event)
事件是基于委托的封装,用于实现发布-订阅模式。事件只能在声明它的类中被触发,外部只能通过 += 或 -= 来订阅或取消订阅,不能直接调用,增强了封装性。
事件使用 event 关键字声明:
public event MyAction OnDataReceived;触发事件时需要先判断是否为 null(即是否有订阅者):
protected virtual void OnDataReceivedHandler(string data){
if (OnDataReceived != null)
OnDataReceived(data);
}
// 或更简洁写法:
OnDataReceived?.Invoke(data);
外部类可以订阅该事件:
obj.OnDataReceived += (msg) => { Console.WriteLine("Received: " + msg); };委托与事件的区别
- 用途不同:委托用于方法引用和回调;事件是委托的封装,用于对象间的通信。
- 访问控制不同:事件对外只能 += 和 -=,不能被外部直接调用或赋值,防止意外触发。
- 封装性更强:事件更适合用于暴露给外部的“通知”机制,如按钮点击、数据到达等。
常见应用场景
- GUI 编程:WinForms 或 WPF 中的按钮点击事件。
- 跨组件通信:一个模块完成任务后通知其他模块。
- 异步操作回调:如文件下载完成、网络请求返回。
- 自定义事件:比如用户登录成功后触发通知服务发送邮件。
基本上就这些。掌握委托和事件,是理解 .NET 中响应式编程和事件驱动架构的基础。不复杂但容易忽略细节,比如事件的 null 判断或多播顺序。
以上就是.NET中委托(Delegate)和事件(Event)的用法的详细内容,更多请关注其它相关文章!
# 拖放
# 食品贸易网站建设案例
# 什么是线上推广营销策略
# 上海网网站建设公司
# 视频关键词搜索seo
# 邯郸网站建设与运营
# 淄博seo推广哪家好
# 如何推广棋牌网站链接
# 仁寿网站优化
# 临海seo排名如何设置
# 网站优化基础工作
# 多个
# 是一种
# 直接调用
# 制作教程
# 事件
# 绑定
# 表单
# 更强
# 自定义
# 回调
# gate
# .net
# 封装性
# 点击事件
# 响应式编程
# 区别
# win
# 工具
# 委托
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
解决Tabulator日期时间排序问题的专业指南
163邮箱官方主页登录 直达网易邮箱登录核心页面
必由学官方平台入口 必由学在线课堂登录地址
火锅吃太多会怎样 火锅吃太多会上火吗
2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析
漫蛙漫画官方首页 漫蛙2漫画在线阅读入口
html5 app怎么运行环境_配html5 app运行环境【教程】
J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案
HTML空白字符处理机制:渲染、DOM与编码实践
html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】
优化大型XML文件解析:基于Python流式处理的内存高效方案
taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】
如何提高微信支付的安全性_微信支付安全防护与设置建议
Python:递归比较文件夹内容并找出特定类型文件的差异
poki免费入口快捷访问 poki人气小游戏直接玩站点
押井守高度称赞《辐射4》:玩了八年都停不下来!
C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用
1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】
Composer如何在生产环境安全地执行composer update
解决深度学习模型训练初期异常高损失与完美验证准确率问题
Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略
Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析
火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧
C#中解析不规范的HTML为XML 常见的坑与解决办法
composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?
新三国志曹操传110级星符试炼夏侯渊极难攻略
Fabric模组开发:自定义物品与物品组的现代管理方法
Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】
vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
Golang指针如何与map组合使用_Golang map指针组合实践
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
mysql如何设置表访问权限_mysql表访问权限配置
c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架
CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠
Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略
AO3最新入口2025公告_AO3中文官网合集
《马克思佩恩3》早期版本曝光 UI设计曾多次调整!
Python自定义类排序:解决lambda键值访问TypeError的实践指南
浏览器打开即用 美图秀秀网页版入口
漫蛙漫画登录站点 漫蛙2正版漫画快速访问
PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】
Go语言中JSON数据解析与字段访问教程
将HTML动态表格多行数据保存到Google Sheet的教程
将JSON对象数组转置为键值对列表的实用指南
J*aScript动态修改指定div内所有a标签样式指南
蛙漫安全无毒 官方认证的绿色入口
CKEditor 5 自定义构建在React应用中渲染失败的调试与解决
Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】
铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则


2025-11-12
浏览次数:次
返回列表
egate)