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

C#中,什么是委托,什么是事件及它们之间的关系

1. 委托(Delegate)

定义与作用
  • 委托‌是类型安全的函数指针,用于封装方法,支持多播(链式调用)。
  • 核心能力‌:将方法作为参数传递或异步回调。
使用场景
  1. 回调机制(如异步操作完成通知)。
  2. 实现策略模式(动态替换算法逻辑)。
  3. LINQ查询中的条件筛选(Where(x => x > 6))。
  4. 多播委托(多个方法依次执行)。
示例代码
// 定义委托 
public delegate void LogHandler(string message); 
/ 使用委托
 public class Processor 
{ public void RunTask(LogHandler logger) 
{ logger("Task started.");
// ...业务逻辑 logger("Task completed."); 
} 
} // 调用方 
var processor = new Processor(); 
processor.RunTask(message => Console.WriteLine($"[LOG] {message}")); 

2. 事件(Event)

定义与作用
  • 事件‌是基于委托的语法糖,强制封装性,遵循‌发布-订阅模式‌。
  • 核心规则‌:只能在声明类内部触发(Invoke),外部仅能+=-=订阅。
使用场景
  1. GUI事件(按钮点击、鼠标移动)。
  2. 观察者模式(状态变化通知)。
  3. 松耦合系统(组件间通信)。
示例代码
// 定义事件
 public class OrderService 
{ 
public event EventHandler<OrderEventArgs> OrderSubmitted; 
public void SubmitOrder(Order order) 
{ 
// ...提交订单逻辑 
OnOrderSubmitted(new OrderEventArgs(order));
 } 
protected virtual void OnOrderSubmitted(OrderEventArgs e) 
{ OrderSubmitted?.Invoke(this, e); } } 
// 订阅事件 var service = new OrderService();
 service.OrderSubmitted += (sender, e) => { 
Console.WriteLine($"Order {e.OrderId} submitted!");
 }; 

3. 委托与事件的关系

特性委托事件
封装性可被外部直接调用只能在声明类内触发
多播支持支持
安全性低(外部可修改委托链)高(外部仅订阅/取消)
典型用途灵活的方法传递系统级通知(如UI交互)

关键点总结

  1. 委托是基础‌:事件本质是受限的委托,编译器自动生成add/remove方法。
  2. 设计原则‌:
    • 事件用于‌被动通知‌(如用户操作)。
    • 委托用于‌主动传递逻辑‌(如回调函数)。
  3. 代码规范‌:事件命名使用动词(如Clicked/DataReceived),委托命名用Handler后缀。

疑问与解决方案

Q1:为什么事件比委托更安全?
A1:事件禁止外部直接赋值(=操作符),强制通过+=-=管理订阅,避免覆盖其他订阅者。

Q2:何时选择自定义委托而非Action/Func
A2:需要明确语义时

(如public delegate void PriceChangedHandler(double oldPrice)优于Action<double>)。

相关文章:

  • Linux内核调试 - Hung_task机制分析下
  • ADZS-ICE-2000和AD-ICE2000仿真器在线升级固件
  • 典范硬币系统(Canonical Coin System)→ 贪心算法
  • EXCEL报错:无法共享此工作薄,因表包含excel表或xml映射的解决方法
  • 合合信息TextIn大模型加速器 2.0来了:智能文档解析和图表解析能力全面升级
  • 深入理解 Linux 文件权限:从 ACL 到扩展属性,解剖底层技术细节与命令应用
  • Selenium三大等待
  • Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量回归预测
  • LeetCode349两个数组的交集
  • uvm transaction
  • 排查使用RestTemplate远程调用,@RequestBody注解接收不到实体类
  • python面试
  • 【天梯赛】L2-004 这是二叉搜索树吗(经典问题C++)
  • 笔试专题(四)
  • Ollama及HuggingFace路径环境变量设置
  • 监控易一体化运维:监控易机房管理,打造高效智能机房
  • 51c嵌入式~三极管~合集1
  • 【Python3教程】Python3基础篇之Lambda(匿名函数)
  • AI赋能,防御无界:群联云防护如何颠覆传统DDoS防御格局?
  • 群晖监控套件通过ONVIF协议添加海康摄像头
  • 网站seo好学吗/韶山百度seo
  • icp备案查询网站/360收录提交入口
  • 铁岭市住房和城乡建设委员会网站/数字营销是干啥的
  • 12306网站多钱做的/如何优化网络
  • 手机网站制作要求标准/安徽百度seo公司
  • 淘宝网站建设问题/乐天seo视频教程