C#之事件
2023-03-14 09:45:24 时间
事件基于委托,可以为任何一种委托类型提供一种发布\订阅机制。
使用event关键字将一个委托类型定义为事件。
下面通过一个例子介绍事件:
//事件发布类 public class PublishEvent { public delegate string Display(string str); public event Display DisplayEvent; //客户端代码通过调用这个方法触发事件 public void Shows(string str) { if (DisplayEvent != null) { DisplayEvent(str); } } } //事件侦听类,这个类订阅事件 public class Listen1 { public string MakeAlert(string str) { Console.WriteLine(str + "Listen1"); return str + "Listen1"; } } public class Listen2 { public string ShowMsg(string str) { Console.WriteLine(str + "Listen2"); return str + "Listen2"; } }
客户端代码:
class Program { static void Main() { PublishEvent pe = new PublishEvent(); Listen1 l1 = new Listen1(); Listen2 l2 = new Listen2(); //变量l1和l2订阅了事件 pe.DisplayEvent += l1.MakeAlert; pe.DisplayEvent += l2.ShowMsg; //触发事件 pe.Shows("事件"); Console.ReadKey(); } }
事件就是一个特殊的委托(http://www.cnblogs.com/afei-24/p/6762442.html),它是一个用于事件驱动模型的专用委托.你可以在客户代码中直接调用委托来激发委托指向的函数,而事件不可以,事件的触发只能由服务代码自己触发。也就是说在你的代码里委托你不但可以安排谁是它的调用函数,还可以直接调用它,而事件不能直接调用,只能通过某些操作触发。除此之此,事件拥有委托的所有功能,包括多播特性。即事件可以有多个事件处理函数,委托同样也可以是个多播委托.
事件是封装过的委托实例;委托是类型,事件是实例!
EventHandler<TEventArgs>.NET自带的委托,也用于定义事件。(可以去MSDN研究)
相关文章
- 小米路由器 AX9000 开发版固件获取 SSH / 安装 MIXBOX & ENTWARE
- Flink日常操作
- 接口测试|Fiddler界面主菜单功能介绍(二)
- (十)汇编语言——CALL和RET指令
- 多目标建模算法PLE
- ruoyi-vue版本框架(二)源码目录结构的讲解,与底层子项目的讲解
- ruoyi-vue版本(三)AsyncManager 实现异步线程池的逻辑操作
- ruoyi-vue版本(四)@PreAuthorize 注解在若依里面的作用,springsecurity 框架相关的配置
- 接口测试|Fiddler界面工具栏介绍(一)
- 特定领域知识图谱(Domain-specific KnowledgeGraph:DKG)融合方案:技术知识前置【一】-文本匹配算法、知识融合学术界方案、知识融合业界落地方案、算法测评KG生产质量保障
- 接口测试|Fiddler界面工具栏介绍(二)
- 如何了解一个软件的设计?
- 2023 年推荐这 10 个开发者工具
- 关于 Safari back 按钮在 iOS 16 不能按照期望工作的问题分析
- 接口测试|Fiddler界面工具栏介绍(三)
- 一款程序员值得拥有的机械键盘:Keychron K3
- 接口测试|Fiddler会话栏中添加IP列
- [oeasy]python0068_ 字体样式_正常_加亮_变暗_控制序列
- 关于 Spartacus 开源 Storefront 在 PWA 模式下运行时的 index.html hash mismatch 问题
- 记录一则exachk进程占用大量CPU资源