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