当前位置: 首页 > news >正文

(七)CSharp-刘铁锰版-事件

一、初步了解事件

定义:单词 Event ,译为“事件”

  • 《牛津词典》中的解释是“a thing that happens,especially something important”
  • 通顺的解释就是“能够发生的什么事情”

角色: 使对象或类具备通知能力的成员

  • (中译)事件(Event)是一种使对象或类能够提供通知的成员
  • (原文)An event is a member that enables an object or class to provide notifications.
  • “对象O拥有一个事件E”想表达的思想是:当事件E发生的时候,O有能力通知别的对象

使用: 用于对象或类间的动作协调与信息传递(消息传递)
原理: 事件模型(event model)中的两个“5

  • ”发生->响应“中的5个部分——闹钟响了你起床、孩子饿了你做饭…这里隐含着”订阅“关系(第5元素,比如闹钟、响了、你、起床,是4个部分;如果没有订阅关系,就没有具备通知能力)
  • ”发生->响应“中的5个动作——(1)我有一个事件->(2)一个人或者一群人关心我的这个事件->(3)我的这个事件发生了->(4)关心这个事件的人会被依次通知到->(5)被通知到的人根据拿到的事件信息(又称”事件数据“、”事件参数“、”通知“)对事件进行响应(又称”处理事件“)。

提示

  • 事件多用于桌面、手机等开发的客户端编程,因为这些程序经常是用户通过事件来”驱动“的
  • 各种编程语言对这个机制的实现方法不尽相同
  • Java 语言里没有事件这种成员,也没有委托这种数据类型。Java 的”事件“是使用接口来实现的
  • MVC、MVP、MVVM 等模式,是事件模式更高级、更有效的”玩法“
  • 日常开发的时候,使用已有事件的机会比较多,自己声明事件的机会比较少,所以先学使用

事件的功能 = 通知 + 可选的事件参数(即详细信息)

事件术语:

  • 事件的订阅者
  • 事件消息的接收者
  • 事件的响应者
  • 事件的处理者
  • 被事件所通知的对象
  • 事件信息、事件消息、事件数据,统一称做事件参数
  • 事件模式,本身也是设计模式

事件模型的五个组成部分

  • 事件的拥有者(event source,对象)
  • 事件成员(event ,成员):用来通知的工具,比如不按下点击click事件,就不会发生事件
  • 事件的响应者(event subscriber,对象)
  • 事件处理器(event handler,成员)——本质上是一个回调方法
  • 事件订阅——把事件处理器与事件关联在一起,本质上是一种以委托类型为基础的”约定“

请添加图片描述

注意:

  • 事件处理器是方法成员
  • 挂接事件处理器的时候,可以使用委托实例,也可以直接使用方法名,这是个”语法糖“
  • 事件处理器对事件的订阅不是随意的,匹配与否由声明事件时所使用的委托类型来检测
  • 事件可以同步调用也可以是异步调用
    例子:
    MouseEvent:事件
    mousePressed:事件处理器

1)

请添加图片描述

 class Program{static void Main(string[] args){Timer timer = new Timer();timer.Interval = 1000;Boy boy = new Boy();Girl girl = new Girl();//timer是拥有者,+= 是订阅,Elapsed是事件,boy是事件响应者,Action是事件处理器//一个事件同时有两个事件处理器的情况timer.Elapsed += boy.Action;timer.Elapsed += girl.Action;timer.Start();Console.ReadKey();}}class Boy{internal void Action(object sender, ElapsedEventArgs e){Console.WriteLine("Jump!");}}class Girl{internal void Action(object sender, ElapsedEventArgs e){Console.WriteLine("Sing!");}}

2)

请添加图片描述

    class Program{static void Main(string[] args){Form form = new Form();Controller controller = new Controller(form);form.ShowDialog();Console.ReadKey();}}class Controller{private Form form;public Controller(Form form){if(form != null){this.form = form;//form是事件拥有者,Click是事件,Controller是事件响应者,FromClicked是事件处理器,+=订阅this.form.Click += this.FromClicked;}    }private void FromClicked(object sender, EventArgs e){this.form.Text = DateTime.Now.ToString();}}

3)

请添加图片描述

    class Program{static void Main(string[] args){Form form = new Form();//系统form是微软编写好的类,没有办法自定义一个Action//form.Click += form.Action;MyForm myForm = new MyForm();//myForm是事件拥有者和事件响应者,Click是事件,FoormClicked是事件处理器,+=是事件订阅myForm.Click += myForm.FoormClicked;myForm.ShowDialog();Console.ReadKey();}}class MyForm : Form{internal void FoormClicked(object sender, EventArgs e){this.Text = DateTime.Now.ToString();}}

4)

请添加图片描述

  • 事件拥有者是事件响应者的字段成员,事件响应是订阅自己成员的事件。
    class Program{static void Main(string[] args){MyForm myForm = new MyForm();myForm.ShowDialog();Console.ReadKey();}}class MyForm : Form{private TextBox textBox;private Button button;public  MyForm(){this.textBox = new TextBox();this.button = new Button();this.Controls.Add(this.button);this.Controls.Add(this.textBox);this.button.Click += this.ButtonClicked;this.button.Text = "Say Hello.";this.button.Top = 100;}private void ButtonClicked(object sender, EventArgs e){this.textBox.Text = "Hello,World!!";}}

二、事件的声明

事件的声明:

  • 完整声明
  • 简略声明(字段式声明,field-like)

有了委托字段/属性。为什么还需要事件?

  • 为了程序的逻辑更加”有道理“、更安全,谨防”借刀杀人“

所以事件的本质是微弱字段的一个包装器

  • 这个包装器对委托字段的访问起限制作用,相当于一个”蒙版“
  • 封装的(encapsulation)的一个重要功能就是隐藏
  • 事件对外界隐藏了委托实例的大部分功能,仅暴露添加/移除事件处理器的功能
  • 添加/移除事件处理器的时候可以直接使用方法名,这是委托实例所不具备的功能

用于声明事件的委托类型的命名约定

  • 1、用于声明Foo事件的委托,一般命名为FooEventHandler(除非是一个非常通用的事件约束)
  • 2、FooEventHandler 委托的参数一般有两个(由 Win32 API 演化而来,历史悠久)
    • 第一个是 object 类型,名字为 sender,实际上就是事件的拥有者、事件的source。
    • 第二个是 EventArgs 类的派生类,类名一般为 FooEventArgs ,参数名为e。也就是前面讲过的事件参数
    • 虽然没有官方的说法,但我们可以把委托的参数列表看作是发生后发送给事件响应者的“事件消息”
  • 3、触发 Foo 事件的方法一般命名为 OnFoo,即”因何引发“、”事件有因“
    • 访问级别为 protected,不能为 public,不然又成了可以”借刀杀人“了

事件的命名约定

  • 带有时态的动词或者动词短语
  • 事件拥有者”正在做“什么事情,用进行时;事件拥有者”做完了“什么事情,用完成时

相关文章:

(七)CSharp-刘铁锰版-事件

一、初步了解事件 定义:单词 Event ,译为“事件” 《牛津词典》中的解释是“a thing that happens,especially something important”通顺的解释就是“能够发生的什么事情” 角色: 使对象或类具备通知能力的成员 (中译&#x…...

【ROS】郭老二博文之:ROS目录

1、ROS2 【ROS】Ubuntu22.04安装ROS2(Humble Hawksbill) 【ROS】ROS2命令行工具详解 【ROS】ROS2中的概念和名词解释 【ROS】ROS2编程示例:话题订阅-发布-C版 【ROS】ROS2编程示例:服务和客户端-C版 【ROS】ROS2编程示例&#xf…...

Android应用程序进程的启动过程

Android应用程序进程的启动过程 导语 到这篇文章为止,我们已经简要地了解过了Android系统的启动流程了,其中比较重要的内容有Zygote进程的启动和SystemService以及Launcher的启动,接下来我们将要学习的是Android应用程序的启动过程&#xff…...

【2】Midjourney注册

随着AI技术的问世,2023年可以说是AI爆炸性成长的一年,近期最广为人知的AI服务除了chatgpt外,就是从去年五月就已经问世的AI绘画工具mid journey了。 ▲几个AI工具也代表了人工智能的热门阶段 只要输入一段文字,AI就会根据语意计算…...

第六十八天学习记录:高等数学:导数(宋浩板书)

导数是微积分中的一个概念,描述了函数在某一个点上的变化率。具体地说,函数 f ( x ) f(x) f(x)在 x a xa xa处的导数为 f ′ ( a ) f(a) f′(a),表示当 x x x在 a a a处发生微小的变化 Δ x \Delta x Δx时, f ( x ) f(x) f(x)对…...

unreal 5 实现角色拾取功能

要实现角色拾取功能,我们需要实现蓝图接口功能,蓝图接口主要提供的是蓝图和蓝图之间可以通信,接下来,跟着教程,实现一下角色的拾取功能。 首先,我们要实现一个就是可视区的物品在朝向它的时候,会…...

chatgpt赋能python:如何使用Python升序排列一个列表?

如何使用Python升序排列一个列表? 在Python编程中,我们经常需要对列表进行排序。列表排序是一种常见的操作,可以帮助我们对数据进行分析和管理。在这篇文章中,我们将学习如何使用Python对一个列表进行升序排列。 什么是升序排列…...

Lecture 20 Topic Modelling

目录 Topic ModellingA Brief History of Topic ModelsLDAEvaluationConclusion Topic Modelling makeingsense of text English Wikipedia: 6M articlesTwitter: 500M tweets per dayNew York Times: 15M articlesarXiv: 1M articlesWhat can we do if we want to learn somet…...

ThreadPoolExecutor线程池

文章目录 一、ThreadPool线程池状态二、ThreadPoolExecutor构造方法三、Executors3.1 固定大小线程池3.2 带缓冲线程池3.3 单线程线程池 四、ThreadPoolExecutor4.1 execute(Runnable task)方法使用4.2 submit()方法4.3 invokeAll()4.4 invokeAny()4.5 shutdown()4.6 shutdownN…...

chatgpt赋能python:Python实践:如何升级pip

Python实践:如何升级pip Python作为一门高效的脚本语言,被广泛应用于数据分析、人工智能、Web开发等领域。而pip则是Python的包管理工具,是开发Python应用的必备工具。但是pip在使用过程中,有时候会出现版本不兼容或者出现漏洞等…...

【JavaEE进阶】mybatis

目录: 一、Mybatis是什么 三个映射关系如下图: 二、mybatis的使用(前置工作简单案例) 第一步:导入MAVEN依赖 第二步: 在spring项目当中新建数据源 第三步:新建一个实体类,是和…...

Redis的大key

什么是 redis 的大 key redis 的大 key 不是指存储在 redis 中的某个 key 的大小超过一定的阈值,而是该 key 所对应的 value 过大对于 string 类型来说,一般情况下超过 10KB 则认为是大 key;对于set、zset、hash 等类型来说,一般…...

MMPretrain

title: mmpretrain实战 date: 2023-06-07 16:04:01 tags: [image classification,mmlab] mmpretrain实战 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccTl9bOl-1686129437336)(null)] 主要讲解了安装,还有使用教程.安装教程直接参考官网.下面讲…...

栈和队列(数据结构刷题)[一]-python

文章目录 前言一、原理介绍二、用栈实现队列1.操作2.思路 三、关于面试考察栈里面的元素在内存中是连续分布的么? 前言 提到栈和队列,大家可能对它们的了解只停留在表面,再深入一点,好像知道又好像不知道的感觉。本文我将从底层实…...

【备战秋招】JAVA集合

集合 前言 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要 对对象进行存储。 另一方面,使用Array存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多…...

setState详解

this. setState( [partialState], [callback]) 1.[partialState] :支持部分状态更改 this, setState({ x:100 //不论总共有多少状态,我们只修改了x,其余的状态不动 });callback :在状态更改/视图更新完毕后触发执行,也可以说只要执行了setS…...

Qt5.12.6配置Android Arm开发环境(windows)

1. 安装jdk1.8 2.安装Android Studio 并安装 SDK 与NDK SDK Tools 选择 26.0.3 SDK Platform 选择 Android SDK Platform 26 NDK选择19版本 安卓ARM环境配置成功如下: JDK1.8 , SDK 26 , NDK 19 在安装QT时要选择 ARMv7(32位CPU)与ARM64-v8a(64位CPU) 选择支持android平台…...

七、进程程序替换

文章目录 一、进程程序替换(一)概念(二)为什么程序替换(三)程序替换的原理(四)如何进行程序替换1. execl2. 引入进程创建——子进程执行程序替换,会不会影响父进程呢? &…...

C++核心编程——详解运算符重载

文章目录&#x1f4ac; 一.运算符重载基础知识①基本概念②运算符重载的规则③运算符重载形式④运算符重载建议 二.常用运算符重载①左移(<<)和右移(>>)运算符重载1️⃣重载后函数参数是什么&#xff1f;2️⃣重载的函数返回类型是什么&#xff1f;3️⃣重载为哪种…...

2023年前端面试汇总-CSS

1. CSS基础 1.1. CSS选择器及其优先级 对于选择器的优先级&#xff1a; 1. 标签选择器、伪元素选择器&#xff1a;1&#xff1b; 2. 类选择器、伪类选择器、属性选择器&#xff1a;10&#xff1b; 3. id 选择器&#xff1a;100&#xff1b; 4. 内联样式&#xff1a;1000&a…...

Cursor AI 编程助手配置优化:一键安装与自定义指南

1. 项目概述&#xff1a;为什么需要一套现成的 Cursor 配置&#xff1f;如果你和我一样&#xff0c;是 Cursor 的重度用户&#xff0c;那么你肯定经历过这样的阶段&#xff1a;刚上手时&#xff0c;觉得这个 AI 驱动的 IDE 简直是神器&#xff0c;但随着项目越来越复杂&#xf…...

城市级智慧停车平台建设思路:如何整合多个停车项目的数据

引言随着城市化进程的加速和机动车保有量的持续攀升&#xff0c;"停车难、停车乱"已经成为困扰各大城市的普遍性问题。根据公安部统计数据&#xff0c;截至2025年底&#xff0c;全国机动车保有量已突破4.5亿辆&#xff0c;而城市停车位缺口预计超过8000万个。与此同时…...

绩效考核的量化迷思:如何衡量不可直接测量的技术贡献

一、量化绩效考核的困境&#xff1a;软件测试的“隐形”价值在软件行业的绩效考核体系中&#xff0c;量化指标似乎成了“公平”与“高效”的代名词。代码行数、Bug数量、测试用例覆盖率……这些清晰可统计的数字&#xff0c;被当作衡量技术人员贡献的核心标尺。然而&#xff0c…...

BIOS里找不到SSD硬盘?Win10启动失败?可能是ESP引导分区‘隐身’了,手把手教你用PE盘和DiskGenius把它找回来

BIOS里找不到SSD硬盘&#xff1f;Win10启动失败&#xff1f;可能是ESP引导分区‘隐身’了 最近遇到一个奇怪的故障&#xff1a;明明SSD硬盘在PE系统里能正常识别&#xff0c;但BIOS启动项里却死活找不到它。系统反复提示"reboot and select proper boot device"&…...

Spring Boot项目整合阿里云OSS上传,如何避免Nginx代理下的405坑?

Spring Boot整合阿里云OSS上传的Nginx避坑指南&#xff1a;彻底解决405错误 在前后端分离架构中&#xff0c;文件上传功能几乎是每个Web应用的标配。当我们将Spring Boot与阿里云OSS结合使用时&#xff0c;Nginx作为反向代理常常会带来一个棘手的405 Method Not Allowed错误。这…...

收藏!小白程序员快速入门大模型:多模态LLMs学习指南

多模态大模型&#xff08;MLLMs&#xff09;通过整合图像、文本、语音等&#xff0c;实现跨模态理解和生成。文章介绍了MLLMs的基本概念、架构&#xff0c;包括多模态编码器、连接器与LLM&#xff0c;并区分了双编码器架构和基于LLM的架构。同时&#xff0c;文章探讨了VLM前沿动…...

3步解锁网易云音乐NCM文件:ncmdump让你的音乐自由播放

3步解锁网易云音乐NCM文件&#xff1a;ncmdump让你的音乐自由播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的加密NCM文件无法在其他设备播放而烦恼吗&#xff1f;ncmdump作为一款专业的网易云音乐NCM文件…...

绝地求生罗技鼠标宏实战指南:5步实现高效压枪技巧

绝地求生罗技鼠标宏实战指南&#xff1a;5步实现高效压枪技巧 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 对于《绝地求生》玩家来说&#xf…...

航模电调XXD2212的“坑”与“宝”:从欠压报警到堵转丢步的实战避坑指南

XXD2212电调实战指南&#xff1a;从欠压保护到电机匹配的深度解析 1. 揭开XXD2212电调的神秘面纱 XXD2212作为航模圈内广为人知的入门级电调&#xff0c;以其极高的性价比吸引了大量无人机和机器人爱好者。这款电调采用新唐科技MS51FB9AE作为主控芯片&#xff0c;搭配六MOS管组…...

紫光同创Logos系列FPGA实战:BGA封装PCB布局与Fanout布线避坑指南(附示意图)

紫光同创Logos系列FPGA实战&#xff1a;BGA封装PCB布局与Fanout布线避坑指南 第一次拿到紫光同创Logos系列FPGA的BGA封装芯片时&#xff0c;那种密密麻麻的焊盘阵列确实会让人头皮发麻。特别是FBG256和FBG484这类高密度封装&#xff0c;如何在有限的空间内完成高质量的Fanout布…...