当前位置: 首页 > news >正文

C# 的委托和事件 总结

C# 中的委托和事件紧密相关但各有特点:

  • 委托是一种引用类型,可看作方法的容器,能封装一个或多个方法(支持多播),允许像传递变量一样传递方法,常用于回调、方法参数传递等场景。外部可直接调用或修改其包含的方法列表。

  • 事件基于委托实现,是特殊的委托成员,主要用于发布 - 订阅模式。它对委托进行了封装,外部只能通过 += 订阅或 -= 取消订阅,不能直接调用或修改,安全性更高,典型用于对象间通信(如按钮点击、状态变更通知)。

简单说,事件是受约束的委托,专为消息通知设计,而委托更通用,是方法的 "指针" 容器。

 

以下是 C# 中委托(Delegate)和事件(Event)的对比:

特性委托(Delegate)事件(Event)
定义是一种引用类型,用于封装方法,类似函数指针基于委托的特殊成员,用于实现发布 - 订阅模式
本质可以直接调用,类似方法变量是委托的封装器,提供更安全的访问控制
声明方式使用delegate关键字声明
public delegate void MyDelegate(string message);
使用event关键字结合委托声明
public event MyDelegate MyEvent;
调用方式可以直接像方法一样调用
myDelegate("Hello");
只能在声明它的类内部调用
MyEvent?.Invoke("Hello");
外部访问外部可以直接赋值、调用、修改调用列表外部只能订阅(+=)或取消订阅(-=),不能直接调用或赋值
用途用于传递方法、回调函数、多播委托等用于实现对象间的通信,通知订阅者状态变化
安全性外部可直接修改委托的调用列表,安全性较低提供封装,防止外部直接修改和调用,安全性更高
多播支持支持多播(通过+=添加多个方法)内部基于多播委托,同样支持多个订阅者
典型场景异步回调、LINQ 查询、委托链等按钮点击、数据变更通知、状态更新等交互场景

总结:委托是方法的容器,提供了一种间接调用方法的方式;而事件是基于委托的特殊机制,主要用于实现松耦合的观察者模式,通过限制外部访问提高了代码的安全性和封装性。事件可以看作是 "受约束的委托",专门用于发布 - 订阅场景。

C# 委托 delegate Actionhttps://blog.csdn.net/LZQqqqqo/article/details/149513681?ops_request_misc=%257B%2522request%255Fid%2522%253A%25226449ba6a14e905e91654fda2b160e178%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=6449ba6a14e905e91654fda2b160e178&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-149513681-null-null.nonecase&utm_term=%E5%A7%94%E6%89%98&spm=1018.2226.3001.4450

C# 事件Eventhttps://blog.csdn.net/LZQqqqqo/article/details/149813211?ops_request_misc=%257B%2522request%255Fid%2522%253A%25226449ba6a14e905e91654fda2b160e178%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=6449ba6a14e905e91654fda2b160e178&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-149813211-null-null.nonecase&utm_term=%E5%A7%94%E6%89%98&spm=1018.2226.3001.4450

http://www.xdnf.cn/news/1230589.html

相关文章:

  • kong网关集成Safeline WAF 插件
  • 【深度学习】【三维重建】windows11环境配置PyTorch3d详细教程
  • JAVA国际版同城服务同城信息同城任务发布平台APP源码Android + IOS
  • 【RK3568 RTC 驱动开发详解】
  • JP3-3-MyClub后台后端(三)
  • C语言输入安全10大边界漏洞解析与防御
  • PyTorch 中 Tensor 统计学函数及相关概念
  • 数据结构初学习、单向链表
  • chrome的数据采集插件chat4data的使用
  • Oracle 11g RAC集群部署手册(三)
  • 12:java学习笔记:多维数组1
  • 面试实战,问题二十二,Java JDK 17 有哪些新特性,怎么回答
  • JavaScript:Ajax(异步通信技术)
  • 用 JavaSwing 开发经典横版射击游戏:从 0 到 1 实现简易 Contra-like 游戏
  • Highly Compressed Tokenizer Can Generate Without Training
  • 【数据结构初阶】--排序(二)--直接选择排序,堆排序
  • 2025 年 VSCode 插件离线下载硬核攻略
  • 数字化生产管理系统设计
  • vue3渲染html数据并实现文本修改
  • 关于人工智能AI>ML>DL>transformer及NLP的关系
  • docker 容器常用命令
  • 用Unity结合VCC更改人物模型出现的BUG
  • 网络安全基础知识【6】
  • Linux 高级 I/O 系统调用详解
  • [硬件电路-114]:模拟电路 - 信号处理电路 - 放大器的种类与比较
  • kotlin小记(1)
  • lumerical——布拉格光栅(2)
  • WAIC引爆AI,智元机器人收购上纬新材,Geek+上市,157起融资撑起热度|2025年7月人工智能投融资观察 · 极新月报
  • 【机器学习】“回归“算法模型的三个评估指标:MAE(衡量预测准确性)、MSE(放大大误差)、R²(说明模型解释能力)
  • webpack面试题及详细答案80题(61-80)