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

文章目录

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Transformer

1. 整体架构 2. Encoder 1)输入部分:Embeding 位置编码 位置编码没搞懂

小程序转换工具—Antmove 使用教学

自从微信小程序问世以后,字节、阿里、百度巨头们都各自搞各自的小程序平台,各有各的技术标准。基础技术都大差不差,但就是没法统一。搞得我们这些对接各平台的程序猿们苦不堪言。 虽说uniapp、Taro、Mpvue、Weex、Flutter都支持跨平台小程序…

LeetCode | 232. 用栈实现队列

​ LeetCode | 232. 用栈实现队列 OJ链接 解题思路: 此题可以用两个栈实现,一个栈进行入队操作,另一个栈进行出队操作出队操作: 当出队的栈不为空是,直接进行出栈操作,如果为空,需要把入队的…

HarmonyOS 实战项目

引言 本章将介绍如何在 HarmonyOS 上进行实际项目开发。我们将从项目需求分析开始,逐步完成项目的设计、开发、测试和上线过程。 目录 项目需求分析项目设计项目开发项目测试项目上线总结 1. 项目需求分析 项目需求分析是项目开发的关键阶段之一,它…

C#,数值计算——插值和外推,Base_interp的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Abstract base class used by all interpolation routines in this chapter. /// Only the routine interp is called directly by the user. /// </summary> pu…

Digicert证书:您的网络安全守护神

在当今数字化的世界中&#xff0c;网络安全已经成为每一个企业和个人必须面对的问题。而Digicert品牌证书&#xff0c;就是您网络安全的最佳选择。它不仅具有强大的安全性和稳定性&#xff0c;还能广泛应用于各种场景&#xff0c;为您提供全方位的保护。 首先&#xff0c;我们要…

Paypal发布公开信,三月已过,PYUSD发展如何?

2023年8月8日&#xff0c;美国支付巨头Paypal正式宣布推出其稳定币PYUSD&#xff0c;成为美国传统大型金融机构发行稳定币的首家企业。 当时&#xff0c;正值美国SEC与加密交易所Coinbase、Binance的诉讼白热化&#xff0c;Paxos被迫停止发行BUSD的阶段&#xff0c;在此背景下&…

计算机网络———ipv6简解

文章目录 1.前言&#xff1a;2. ipv6简单分析&#xff1a;2.1.地址长度对比2.2. ipv6包头分析2.3. ipv6地址的压缩表示&#xff1a;2.3. NDP&#xff1a;2.4. ipv6地址动态分配&#xff1a; 1.前言&#xff1a; 因特网地址分配组织)宣布将其最2011年2月3日&#xff0c;IANA (In…

从0开始学习JavaScript--JavaScript 循环与迭代详解

JavaScript中的循环和迭代是编写高效和灵活代码的关键。循环用于重复执行一段代码&#xff0c;而迭代则用于遍历数据结构。本文将深入研究JavaScript中常见的循环结构和迭代方法&#xff0c;并通过丰富的示例代码来帮助读者更好地理解和运用这些概念。 基本的for循环 for循环…

【微软技术栈】C#.NET 内存映射文件

本文内容 进程、视图和管理内存使用内存映射文件编程示例 内存映射文件包含虚拟内存中文件的内容。 借助文件和内存空间之间的这种映射&#xff0c;应用&#xff08;包括多个进程&#xff09;可以直接对内存执行读取和写入操作&#xff0c;从而修改文件。 可以使用托管代码访…

前端404页面的制作

1、背景 前端开发经常遇到输入路径不存在的问题&#xff0c;为此&#xff0c;把之前项目的404拿出来供大家参考。代码很简单&#xff0c;适合新手入手&#xff0c;效果如下&#xff1a; 2、代码引用的是element-plus框架 <template><div><el-result icon"…

String字符串性能优化的几种方案

原创/朱季谦 String字符串是系统里最常用的类型之一&#xff0c;在系统中占据了很大的内存&#xff0c;因此&#xff0c;高效地使用字符串&#xff0c;对系统的性能有较好的提升。 针对字符串的优化&#xff0c;我在工作与学习过程总结了以下三种方案作分享&#xff1a; 一.优…

linux虚拟机环境快速搭建redis5.x版本的主从集群总结

原创/朱季谦 我在阿里云服务器上曾参与过公司redis集群的搭建&#xff0c;但时间久了&#xff0c;都快忘记当时的搭建过程了&#xff0c;故而决定在虚拟机centOS 7的环境&#xff0c;自行搭建一套redis5.x版本的集群&#xff0c;该版本集群的搭建比较方便&#xff0c;不用再像…

上海亚商投顾:沪指低开低走 抖音概念股逆势爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;深成指跌超1%&#xff0c;创业板指跌超1.8%。抖音概念股逆势爆发&#xff0c;佳…

Codewhisperer 使用评价

最近亚⻢逊推出了一款基于机器学习的 AI 编程助手 Amazon CodeWhisperer&#xff0c;可以实时提供代码建议。在编写代码时&#xff0c;它会自动根据现有的代码和注释给出建议。Amazon CodeWhisperer 与GitHub Copilot类似&#xff0c;主要的功能有: 代码补全注释和文档补全代码…

asp.net网上书店管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目

一、源码特点 asp.net网上书店管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 asp.net网上书店系统1 二、功能介绍 本系统使用Microsoft Visual Studio 2019为开发工具&#xff0c;SQL Server为…

【ARM Trace32(劳特巴赫) 使用介绍 2.1 -- TRACE32 Practice 脚本 cmm 脚本学习】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 上篇文章【ARM Trace32(劳特巴赫) 使用介绍 2 - Veloce 环境中使用trace32 连接 Cortex-M33】 下篇文章【ARM Trace32(劳特巴赫) 使用介绍 2.2 – TRACE32 进阶命令之 DIAG 弹框命令】 文章目录 1. TRACE32 Practice 语法1.…

UE基础篇七:特效

导语&#xff1a; 文末有工程地址&#xff0c;通过小游戏来学习特效 入门 下载项目&#xff0c;在文章最下面 按播放开始游戏。按住左键射击并使用W、A、S和D移动。 在本教程中&#xff0c;您将创建两个粒子效果。一个用于船舶的推进器&#xff0c;一个用于船舶爆炸时。要创…

filter - 常用滤镜效果(毛玻璃、图片阴影、图片褪色)

文章目录 filter 属性滤镜算法函数blur&#xff1a;高斯模糊hue-rotate&#xff1a;色相环contrast&#xff1a;对比度grayscale&#xff1a;灰度drop-shadow&#xff1a;图片阴影 常见的滤镜效果图片内容轮廓阴影毛玻璃图片黑白调整图片色相和对比度使元素或文字变圆润 filter…

租赁小程序|租赁系统一种新型的商业模式

租赁市场是一个庞大的市场&#xff0c;它由出租人和承租人组成&#xff0c;以及相关的中介机构和供应商等。随着经济的发展和人们对灵活性的需求增加&#xff0c;租赁市场也在不断发展和壮大。特别是在共享经济时代&#xff0c;租赁市场得到了进一步的推动和发展。租赁系统是一…