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

news2024/12/26 11:56:04

文章目录

    • 15.1 发布者和订阅者
    • 15.2 源代码组件概览
    • 15.3 声明事件
    • 15.4 订阅事件
    • 15.5 触发事件
    • 15.6 标准事件的用法
      • 15.6.1 通过扩展 EventArgs 来传递数据
      • 15.6.2 移除事件处理程序
    • 15.7 事件访问器

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 事件访问器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1217846.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSM整合原理和实战

一、SSM整合理解 父工程用pom 我原来没见过,

开源与闭源:数字化时代的辩论与未来走向

在当今的数字化时代,关于开源和闭源软件的辩论一直是技术界的热门话题。 特斯拉CEO马斯克最近也加入了这场辩论,公开表示OpenAI不应该闭源,而他自己的首款聊天机器人将选择开源。 这引发了人们对开源与闭源软件的进一步思考:开源是…

【Java】详解多线程通信

🌺个人主页:Dawn黎明开始 🎀系列专栏:Java ⭐每日一句:什么都不做,才会来不及 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️ 文章目录 🔐多…

Android——模块级build.gradle配置——applicationId和namespace

官方地址: 配置应用模块-applicationId和namespace了解 build.gradle 中的实用设置。https://developer.android.google.cn/studio/build/configure-app-module?hlzh-cn 产生那些异常场景: Android:Namespace not specified. Please spec…

【电路笔记】-脉冲宽度调制(PWM)与电机转速控制

脉冲宽度调制(PWM)与电机转速控制 文章目录 脉冲宽度调制(PWM)与电机转速控制1、概述2、电机转速控制3、PWM产生 有许多不同的方法来控制直流电机的速度,但一种非常简单且容易的方法是使用脉冲宽度调制(PWM…

ES Kibana 安装

ES & Kibana 本文基于Docker安装部署使用 Kibana的版本和ElasticSearch的版本,以及IK分词器的版本一一对应 Kibana 安装 安装Kibana # 创建网络 [rootiZ2zeg7mctvft5renx1qvbZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway …

数据结构树与二叉树的实现

目录 一、普通树的存储结构 1、双亲表示法 2.孩子表示法 二、二叉树 1.二叉树的顺序存储(必须是完全二叉树,否则很浪费空间) 1)结构体 2.二叉树的链式存储 1)结构体 2)操作 1.创建一颗二叉树 2.创…

kubernetes--数据存储

目录 一、数据存储引言: 二、基础存储卷: 1. emptyDir存储卷: 2. hostPath存储卷: 3. nfs共享存储卷: 3.1 配置nfs: 3.2 master节点编写yaml文件: 4. 总结: 三、PVC和PV: 1. PV 的…

vivado产生报告阅读分析6-时序报告2

1、复查时序路径详情 单击“ OK ”运行报告命令后 , 将打开一个新窗口。这样您即可复查其中内容。在其中可查看执行选定的每种类型 (min/max/min_max ) 的分析之后所报告的 N 条最差路径。 下图显示的“Report Timing ” ( 时序报告 ) 窗口…

【无标题】chapter6卷积

此例以说明全连接层处理图片的时候会遇到参数过多 模型过大的问题 参数比要研究的物体总数还多 卷积,特殊的全联接层 平移不变形,局部性 原本权重为二维(输入和输出全联接,想想下表组合,就是个二维的矩阵)…

pytorch 安装 2023年

pytorch网址:https://pytorch.org/get-started/locally/ conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia我在自己电脑上用这个pip命令完全安装不了,只能用conda安装。复制上面提供的命令,在cmd中直接运…

腾讯云服务器新用户优惠政策,腾讯云新人服务器购买入口

腾讯云服务器新用户优惠政策是腾讯云为新用户提供的一种优惠,它可以帮助新用户以更低的价格购买腾讯云服务器,并且还提供一些额外的优惠。腾讯云服务器对于新用户有着非常优惠的政策。无论你是个人用户还是企业用户,只要你是第一次购买腾讯云…

flutter TabBar指示器

第一层tabView import package:jade/configs/PathConfig.dart; import package:jade/customWidget/MyCustomIndicator.dart; importpackage:jade/homePage/promotion/promotionPost/MyPromotionListMainDesc.dart; import package:jade/homePage/promotion/promotionPost/MyPr…

ProtocolBuffers(protobuf)详解

目录 前言特点语法定义关键字JSON与Protocol Buffers互相转换gRPC与Protocol Buffers的关系 前言 Protocol Buffers(通常简称为protobuf)是Google公司开发的一种数据描述语言,它能够将结构化数据序列化,可用于数据存储、通信协议…

交换排序详讲:冒泡排序+快速排序(多方法+思路+图解+代码)

文章目录 交换排序一.冒泡排序二.快速排序1.挖坑法2.Hoare法 交换排序 根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。 一.冒泡排序 /*** 冒泡排序* 时间复杂度 n^2* 空间复杂…

用Postman发送xml数据

启动Postman: 点击左上角的“New”,在弹出窗中选择HTTP: 选择POST方法: 点击Body: 选择raw: 在右侧的下拉列表中选择XML: 在下面的输入框中输入或者从其它地方拷贝XML文本:…

cookie机制

目录 为什么会有cookie?? cookie从哪里来的?? cookie到哪里去?? cookie有啥用?? session HttpServletRequest类中的相关方法 简单的实现cookie登录功能 实现登录页面 实现servlet逻辑 实现生成主…

uni-app 蓝牙打印, CPCL指令集使用

先上代码: GitHub - byc233518/uniapp-bluetooth-printer-demo: 使用uniApp 连接蓝牙打印机 Demo, CPCL 指令简单实用示例 (内含 芝珂,佳博,精臣 多个厂家指令集使用文档) 文件结构: ├── App.vue ├── CPCL 指令手册.pdf // 指令集参考手册 ├── LICENSE ├── R…

【JAVA-排列组合】一个套路速解排列组合题

说明 在初遇排列组合题目时,总让人摸不着头脑,但是做多了题目后,发现几乎能用同一个模板做完所有这种类型的题目,大大提高了解题效率。本文简要介绍这种方法。 题目列表 所有题目均从leetcode查找,便于在线验证 46.…

Mindomo Desktop for Mac(免费思维导图软件)下载

Mindomo Desktop for Mac是一款免费的思维导图软件,适用于Mac电脑用户。它可以帮助你轻松创建、编辑和共享思维导图,让你的思维更加清晰、有条理。 首先,Mindomo Desktop for Mac具有直观易用的界面。它采用了Mac独特的用户界面设计&#xf…