C# 图解教程 第5版 —— 第15章 事件

15.1 发布者和订阅者

​ 发布者 / 订阅者模式:发布者定义了一系列事件,订阅者可以通过向发布者提供一个方法来“注册”以获取通知。

​ 当事件发生时,发布者“触发事件”,然后执行订阅者提交的所有方法。

image-20231103180517931
图15.1 发布者和订阅者
  • 发布者:发布某个事件的类或结构,其他类可以在该事件发生时得到通知。
  • 订阅者:注册事件,在事件发生时得到通知的类或结构。
image-20231103180753626
图15.2 事件含有被封装的委托
  • 事件提供私有委托的结构化访问,你无法直接访问委托。
  • 对事件只能进行添加、删除或调用操作。
  • 事件被触发时会调用委托来依次执行列表中的方法。
image-20231103181031956
图15.3 具有一个事件的类结构和术语

15.2 源代码组件概览

​ 需要在事件中使用的代码有以下 5 部分:

  1. 委托类型声明。
  2. 事件处理程序声明。
  3. 事件声明。
  4. 事件注册。
  5. 触发事件的代码。
image-20231103181440334
图15.4 使用事件时的 5 个源代码组件

15.3 声明事件

  • 事件声明在一个类中。
  • 需要委托类型的名称。
  • 声明为 public 以供外部订阅者访问。
  • 不能使用 new 创建事件对象。
image-20231103181639903
图15.5 声明事件

​ 事件是成员,并不是类型:

  1. 不能在一段可执行代码中声明事件。
  2. 必须声明在类或结构中。
  3. 事件成员被隐式自动初始化为 null。
  4. BCL 声明了名为 EventHandler 的委托,专门用于系统事件。

15.4 订阅事件

  • 使用 += 运算符为事件添加事件处理程序。
  • 事件处理程序可以是以下任意一种:
    • 实例方法。
    • 静态方法。
    • 匿名方法。
    • Lambda 表达式。
image-20231103182013844 image-20231103182116181
图15.6 订阅事件的方式

15.5 触发事件

  • 触发事件前与 null 比较。
  • 和调用方法一样使用事件。
image-20231103182555769
图15.7 触发事件

​ 以下示例展示发布者 Incrementer 和订阅者 Dozens 的使用,在 DoCount 方法中,每增加 12 个计数就触发 CountedADozen 事件。

image-20231103182745213 image-20231103182826555
图15.8 包含发布者和订阅者的完整程序,展示了使用事件所必须的 5 个部分

15.6 标准事件的用法

​ Windows GUI 编程广泛使用事件,EventHandler 委托类型的声明如下:

image-20231103183104166
图15.9 EventHandler 委托类型声明
  • 第一个参数用来保存触发事件对象的引用。
  • 第二个参数用来保存状态信息。
  • EventArgs 不能传递任何数据,通常会被忽略。
  • 如果需要传递数据,需要对 EventArgs 进行派生,用合适字段存储数据。
  • object 和 EventArgs 总是传入参数的基类,因此可以用于处理所有事件。

15.6.1 通过扩展 EventArgs 来传递数据

​ 自定义如下信息类,类的名称应以 EventArgs 结尾:

image-20231103183843250 image-20231103183828505
图15.10 自定义信息类

​ 使用带泛型的委托以使用自定义信息类:

image-20231103184021031 image-20231103184201741
图15.11 使用泛型委托以使用自定义信息类

15.6.2 移除事件处理程序

​ 使用 -= 运算符移除事件处理程序。

​ 和委托类似,如果一个处理程序在事件内注册了多次,移除时只移除列表最后一个。

15.7 事件访问器

​ 使用 addremove 访问器可以修改 +=-= 运算符的行为。

  • 声明事件访问器看上去和声明属性类似。
  • 声明事件访问器后,事件不包含内嵌委托,需要自己实现存储和移除事件的方法。
  • 事件访问器没有返回值,为 void 方法。
image-20231103184600692
图15.12 事件访问器
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
《C How to Program,Fifth Edition》(中文名:《C大学教程》),作者:【美】P.J.Deitel、【美】H.M.Deitel,翻译:苏小红、李东、王甜甜,出社:电子工业出社,ISBN:978-7-121-05662-8,PDF 格式,大小 352 Mb,被压缩为 7 部分,本资源是第一部分;第一部分下载地址:http://download.csdn.net/source/3289551;第二部分下载地址:http://download.csdn.net/source/3286123;第三部分下载地址:http://download.csdn.net/source/3285981;第四部分下载地址:http://download.csdn.net/source/3284551;第五部分下载地址:http://download.csdn.net/source/3283848;第六部分下载地址:http://download.csdn.net/source/3290125;第七部分下载地址:http://download.csdn.net/source/3280289。 七个资源在一起解压缩后(windows 平台下解压缩)即可得到《C大学教程(第五·中文)》.pdf 一书。 内容简介: 本书是全球最畅销的C语言教程之一。本书系统地介绍了四种当今流行的程序设计方法——面向过程、基于对象、面向对象以及泛型编程,内容全面、生动、易懂,作者由浅入深地介绍结构化编程及软件工程的基本概念,从简单的概念到最终完整的语言描述,清晰、准确、透彻、详细地讲解C语言,尤其注重程序设计思想和方法的介绍。相对于以往的本,在内容方面,本书新增加了介绍C99标准、排序、基于Allegro C函数库的游戏编程以及有关C++面向对象程序设计的节,并且在附录中增加了Sudoku游戏程序设计的讲解。新加入的“活代码”方法(即通过可执行的代码来讲解理论概念的方法)是本书的另一特色,它可以促进学生积极地参与到程序设计中来。突出显示的各种程序设计提示,则是作者多年教学经验的总结。 本书不仅适合于初学者学习,作为高校计算机程序设计教学的教科书,也同样适用于有经验的程序员,作为软件开发人员的专业参考书。 内容预览: 第1 计算机、Internet和万维网导论 第2 C语言程序设计入门 第3 结构化的C程序设计 第4 C程序控制 第5 C函数 第6 C数组 第7 C指针 第8 C字符和字符串 第9 格式化输入输出 第10 结构体、共用体、位操作和枚举类型 第11 文字处理 第12 数据结构 第13 C预处理 第14 C语言的其他专题 第15 基于Allegro C函数库的游戏编程 第16 排序:更深入的透视 第17 C99简介 第18 C++,一个更好的C;介绍对象技术 第19 类与对象简介 第20 类;深入剖析(第1部分) 第21 类;深入剖析(第2部分) 第22 运算符重载 第23 面向对象编辑:继承 第24 面向对象编程:多态 第25 模板 第26 输入/输出 第27 异常处理 附录A 因特网和Web资源、 附录B 运算符优先级表、 附录C ASCLL字符集 附录D 数制系统 附录E 游戏编程:求解Sudoku问题 索引

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔗理苦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值