新闻中心

.NET中委托(Delegate)和事件(Event)的用法

2025-11-12
浏览次数:
返回列表
委托是类型安全的函数指针,用于引用方法并实现回调;事件基于委托,提供封装性更强的发布-订阅模式,只能在类内触发、外部订阅,常用于GUI交互与组件通信。

.net中委托(delegate)和事件(event)的用法

在 .NET 中,委托(Delegate)事件(Event) 是实现回调机制和松耦合设计的重要工具。它们常用于异步编程、GUI 交互、观察者模式等场景。

什么是委托(Delegate)

委托是一种类型安全的函数指针,它定义方法的签名,并可以引用具有相同签名的方法。委托允许将方法作为参数传递,也可以在运行时动态绑定方法。

声明一个委托使用 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 Reachout.ai

一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造

Reachout.ai 142 查看详情 Reachout.ai 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改签提前车次规则 

搜索