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

【C#语言入门】17. 事件详解(上)

【C#语言入门】17. 事件详解(上)

一、初步了解事件

  • 定义:单词Event,译为“事件”
    • 通顺的解释就是**“能够发生的什么事情”**,例如,“苹果”不能发生,但是“公司上市”这件事能发生。
    • 在C#中事件是类型的成员,没有公司就没有公司上市这件事。
  • 担任角色:使对象或者类具备通知能力的成员。
    • (中译)事件(event)是一种使对象或者类能够提供通知的成员。
    • (原文)An event is a member that enables an object or class to provide notifications.
    • “对象O拥有一个事件E”想要表达的思想是:当事件E发生的时候,O有能力通知别的对象。
    • 事件的功能——通知 + 可选的事件参数(即详细信息)
  • 使用:用于对象或者类间的动作协调与信息传递(消息推送)
  • 原理:事件模型(event model)中的两个“5”
    • “发生→响应”中的五个部分:闹钟响了我起床,时间到了我下班……隐含着第五个部分“订阅”关系,某关心某的状态。
    • “发生→响应”中的五个动作:(1)我有一个事件 →(2)一个人或者一群人关心我的这个事件 →(3)我的这个事件发生了 →(4)关心这个事件的人会被依次通知到 →(5)被通知到的人根据拿到的事件信息(又称“事件数据”、“事件参数”、“通知”)对事件进行响应(又称“处理事件”)。
  • 术语定义:
    • 事件的订阅者 = 事件消息的接受者,事件的响应者,事件的处理者,被事件所通知的对象。
    • 事件参数 = 事件信息,事件消息,事件数据。
  • 提示:
    • 事件多用于桌面、手机等开发的客户端编程,因为这些程序经常是用户通过事件来驱动的。
    • 各种编程语言对这个机制的实现方法不尽相同。
    • Java语言里面没有事件这种成员,也没有委托这种数据类型。Java的"事件"是使用接口来实现的
    • MVC\MVP\MVVM等模式,是事件模式更高级、更有效的“玩法”
    • 日常开发的时候,使用已有事件的机会比较多,自己声明事件的机会比较少,所以先学会使用。

二、事件的应用

  • 实例演示

    • 派生(继承)与扩展(extends)
  • 事件模型的五个组成部分

    1. 事件的拥有者(event source,对象)
    2. 事件成员(event,成员)
    3. 事件的响应者(event subscriber,对象)
    4. 事件处理器(event hander,成员)——本质上是一个回调方法
    5. 事件订阅——把事件处理器与事件关联在一起,本质上是一种以委托类型为基础的“约定”。
  • 组合方式
    请添加图片描述
    请添加图片描述
    请添加图片描述

  • 注意

    • 事件处理器是方法成员
    • 挂接事件处理器的时候,可以使用委托实例,也可以直接使用方法名,这是个语法糖
    • 事件处理器对事件的订阅不是随意的,匹配与否由声明事件时所使用的委托类型来检测
    • 事件可以同步调用也可以异步调用
internal class Program
{static void Main(string[] args){Timer timer = new Timer();timer.Interval = 1000;//单位毫秒Boy boy = new Boy();Girl girl = new Girl();timer.Elapsed += girl.Action;timer.Elapsed += boy.Action;//订阅操作+=,Elapsed是事件成员,timer是事件拥有者,boy是事件响应者timer.Start();Console.ReadLine();}
}class Boy
{internal void Action(object sender, ElapsedEventArgs e){Console.WriteLine("Jump!");}
}class Girl
{internal void Action(object sender, ElapsedEventArgs e){Console.WriteLine("Sing!");}
}
class EventExample1
{static void Main(string[] args){Form form = new Form();//事件拥有者Controller controller = new Controller(form);//事件响应者form.ShowDialog();}}class Controller
{private Form form;public Controller(Form form){if (form != null){this.form = form;this.form.Click += this.FormClicked;//事件成员,事件订阅}}private void FormClicked(object sender, EventArgs e){this.form.Text = DateTime.Now.ToString();//事件处理器}
}
class EventExample1
{static void Main(string[] args){MyForm myForm = new MyForm();myForm.Click += myForm.FormClicked;myForm.ShowDialog();    }}class MyForm : Form
{internal void FormClicked(object sender, EventArgs e){this.Text = DateTime.Now.ToString();}
}
class EventExample1
{static void Main(string[] args){MyForm form = new MyForm();form.ShowDialog();}}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;this.button.Left = 50;}private void ButtonClicked(object sender, EventArgs e){this.textBox.Text = "Hello,World!!!!!!!!!!!!!!";//事件处理器}
}

相关文章:

【C#语言入门】17. 事件详解(上)

【C#语言入门】17. 事件详解(上) 一、初步了解事件 定义:单词Event,译为“事件” 通顺的解释就是**“能够发生的什么事情”**,例如,“苹果”不能发生,但是“公司上市”这件事能发生。在C#中事…...

Charles无法打开导出的har文件解决方法

打开出错:MalformedJson: Use JsonReader.setLenient(true) to accept malformed JSON at line1 column 1368184 path $.log.entries[41].request.postData.text 一、解决办法 用json.dumps格式化一下里面内容,保存为新文件再打开 import jsondef modify…...

FFmpeg--FlvPaser源码:解析.flv输出.h264

文章目录 程序功能:函数调用流程:部分FlvParse.h部分FlvParse.cpp 程序功能: 解析flv文件,重写一个h264文件,如输入movie.flv , 输出movie.h264 (只有视频,没有声音) 函数调用流程: 1 Proce…...

【项目笔记】java微服务:黑马头条(day02)

文章目录 app端文章查看,静态化freemarker,分布式文件系统minIO1)文章列表加载1.1)需求分析1.2)表结构分析1.3)导入文章数据库1.3.1)导入数据库1.3.2)导入对应的实体类 1.4)实现思路1.5)接口定义1.6)功能实现1.6.1):导入heima-leadnews-article微服务&am…...

每天五分钟计算机视觉:图像数据不足带来的问题和解决办法

本文重点 在当今的数字时代,图像数据的应用已经渗透到各个领域,包括但不限于计算机视觉、机器学习、自动驾驶、医疗诊断等。然而,当图像数据不足时,会引发一系列问题,对相关应用产生负面影响。 尤其是计算机视觉领域,图像数据尤为珍贵和稀缺,如果计算机视觉的任务中,如…...

手机App防沉迷系统C卷(JavaPythonC++Node.jsC语言)

智能手机方便了我们生活的同时,也侵占了我们不少的时间。"手机App防沉迷系统"能够让我们每天合理的规划手机App使用时间,在正确的时间做正确的事。 它的大概原理是这样的: 1、在一天24小时内,可注册每个App的允许使用时段; 2、一个时段只能使用一个App,举例说明…...

【WEEK2】学习目标及总结【SpringMVC】【中文版】

学习目标: 三周完成SpringMVC入门——第二周 学习内容: 参考视频教程【狂神说Java】SpringMVC最新教程IDEA版通俗易懂使用注释完成MVC程序Controller控制器RestFul风格结果跳转方式数据处理 学习时间及产出: 第二周 MON~FRI 2024.3.4 【W…...

Git版本工具学习

目录 版本控制git配置工作区域文件状态git对象模型基础命令.gitignore忽略文件IDEA集成Git 版本控制 本地版本控制:在本地记录每一次版本更新。 集中版本控制:版本数据都保存在单一服务器,不联网就看不到版本信息。SVN 分布式版本控制&…...

baidu, google和chatgpt -- 翻译对比

原文 That ChatGPT can automatically generate something that reads even superficially like human-written text is remarkable, and unexpected. But how does it do it? And why does it work? My purpose here is to give a rough outline of what’s going on inside…...

高分辨率全球海洋温度和盐度再分析数据Global Ocean Physics Reanalysis(0.083°),并利用matlab读取绘图

1.引言 在研究全球海平面变化的问题中,卫星测高获得总的海平面变化,而海平面变化包含质量变化和比容变化。因此测高数据和海洋物理分析数据对于海平面研究至关重要。 测高数据下载网址: Global Ocean Gridded L 4 Sea Surface Heights And …...

微信小程序修改placeholder样式

微信小程序有既定的修改placeholder的标签 一、placeholder-style直接修改样式 <input type"text" placeholder"请输入" placeholder-style"color:#e2e2e2;"></input>二、placeholder-class设置样式类 <input type"text&…...

爬虫案例1

通过get请求直接获取电影信息 目标页面: https://spa6.scrape.center/在network中可以看到是通过Ajax发送的请求&#xff0c;这个请求在postman中也可以直接请求成功&#xff0c;这只是一个用来练习爬虫的&#xff0c;没有达到js逆向的过程&#xff0c;需要通过分析js 代码来获…...

修改表结构

目录 修改表结构 创建数据表插入数据 修改已有列 修改 member 表的 name 列的定义 为表增加列 增加一个 address 列&#xff0c;这个列上不设置默认值 增加一个 sex 列&#xff0c;这个列上设置默认值 删除表中的列 删除 sex 列 Oracle从入门到总裁:​​​​​​https…...

Rust 语言中的 into() 方法

在 Rust 中&#xff0c;into() 方法通常用于将一个类型的值转换为另一个类型&#xff0c;这通常涉及到资源的所有权转移。into() 方法通常定义在实现了 Into<T> trait 的类型上&#xff0c;该 trait 允许一个类型被“转换”为另一个类型。 into() 方法的一个常见用途是在…...

MinIO权限提升漏洞CVE-2024-24747详细解决办法

漏洞名称&#xff1a; MinIO权限提升漏洞(CVE-2024-24747) 漏洞简介 2024年2月2日&#xff0c;深瞳漏洞实验室监测到一则MinIO 存在权限提升漏洞的信息&#xff0c;漏洞编号&#xff1a;CVE-2024-24747&#xff0c;漏洞威胁等级&#xff1a;高危。 该漏洞是由于用户创建的访…...

“我快无聊死了”用英语怎么说?柯桥英语口语学习,成人零基础学外语

每日一句 Im bored to death. 我快无聊死了。 单词解析&#xff1a; bored / bɔːd / adj.无聊的&#xff0c;厌倦的 bored to d15857575376eath&#xff1a;指非常无聊或厌烦&#xff0c;达到了极点的程度。 "bored" 和 "boring" 都与无聊相关&#…...

JS ATM练习案例(复习循环知识)

需求&#xff1a;用户可以选择存钱、取钱、查看余额和退出功能。 分析&#xff1a;1循环时反复出现提示框&#xff0c;所以提示框写到循环里面。 2.退出的条件是4&#xff0c;所以是4就会结束循环 3.提前准备一个金额预存储 4取钱为减法操作&#xff0c;存钱为加法操作&#xf…...

Android 二维码相关(一)

Android 二维码相关(一) 本篇文章主要记录下android下使用zxing来创建二维码. 1: 导入依赖 api "com.google.zxing:core:3.5.1"2: 创建二维码 创建QRCodeWriter对象 QRCodeWriter qrCodeWriter new QRCodeWriter(); 将文本内容转换成BitMatrix BitMatrix encode …...

利用tree命令自动保存文件层级结构

tree命令的使用 为了将上图左侧的文件目录&#xff0c;生成上图右侧中的文件夹结构列表&#xff0c;保存在txt中&#xff0c;使用了如下cmd命令&#xff1a; C:\armadillo-12.8.0>tree .>list.txt以上tree命令分为3部分&#xff1a; tree 命令. 在当前目录>list.tx…...

C++初阶:内存管理

目录 1. C/C中各种资源的内存分布1.1 C/C程序内存区域划分1.2 各资源的内存分布情况&#xff08;练习&#xff09; 2. C中的动态内存管理方式2.1 new/delete开辟内置类型空间2.2 new/delete开辟销毁自定义类型空间 3. operator new 与 operator delete函数4. new与delete的实现…...

日志收集工具-Filebeat

提示&#xff1a;windows 环境下 Filebeat 的安装与使用 文章目录 前言一、安装二、配置部署三、启动测试 前言 Filebeat 一般用于日志采集&#xff0c;由两部分组成 &#xff1a;Harvesters 和 prospector Harvesters采集器&#xff1a;逐行读取单个文件的内容&#xff0c;并…...

vue3单独封装表单校验函数

1.在页面中建一个.ts文件 import { useI18n } from /hooks/web/useI18n import { FormItemRule } from element-plusconst { t } useI18n()interface LengthRange {min: numbermax: numbermessage?: string } //必输项校验 export const useValidator () > {const requi…...

CRMEB 中 PHP 快递查询扩展实现:涵盖一号通、阿里云、腾讯云

目前已有一号通快递查询、阿里云快递查询扩展 扩展入口文件 文件目录 crmeb\services\express\Express.php 默认一号通快递查询 namespace crmeb\services\express;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use think\Container; use thi…...

C++11 Move Constructors and Move Assignment Operators 从入门到精通

文章目录 一、引言二、基本概念2.1 右值引用&#xff08;Rvalue References&#xff09;2.2 移动语义&#xff08;Move Semantics&#xff09; 三、移动构造函数&#xff08;Move Constructors&#xff09;3.1 定义和语法3.2 示例代码3.3 使用场景 四、移动赋值运算符&#xff…...

C++.OpenGL (1/64) 创建窗口(Hello Window)

OpenGL 创建窗口(Hello Window) 步骤详解与代码实现 #mermaid-svg-436DlGvysFQogISc {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-436DlGvysFQogISc .error-icon{fill:#552222;}#mermaid-svg-436DlGvysFQogISc…...

Qwen2.5-VL - 模型结构

Qwen2.5-VL - 模型结构 flyfish 配置项 (Configuration)Qwen2.5-VL-3BQwen2.5-VL-7BQwen2.5-VL-72B视觉Transformer (ViT)隐藏层大小 (Hidden Size)128012801280层数 (# Layers)323232头数 (# Num Heads)161616中间层大小 (Intermediate Size)345634563456patch尺寸 (Patch S…...

视频监控管理平台EasyCVR与V4分析网关对接后告警照片的清理优化方案

一、问题概述​ 在安防监控、设备运维等场景中&#xff0c;用户将视频监控管理平台EasyCVR与V4网关通过http推送方式协同工作时&#xff0c;硬件盒子上传的告警图片持续累积&#xff0c;导致EasyCVR服务器存储空间耗尽&#xff0c;影响系统正常运行与告警功能使用。 二、解决方…...

Java-IO流之打印流详解

Java-IO流之打印流详解 一、打印流概述1.1 什么是打印流1.2 打印流的特点1.3 打印流的应用场景 二、PrintStream详解2.1 基本概念2.2 构造函数2.3 核心方法2.4 使用示例 三、PrintWriter详解3.1 基本概念3.2 构造函数3.3 核心方法3.4 使用示例 四、PrintStream与PrintWriter的比…...

HTTP、WebSocket、SSE 对比

特性HTTPWebSocketSSE (Server-Sent Events)通信模式请求-响应&#xff08;单向&#xff09;全双工双向通信服务器到客户端的单向通信连接方式短连接&#xff08;默认&#xff09;长连接长连接协议基础TCP&#xff08;HTTP/1.1, HTTP/2&#xff09;基于HTTP升级基于HTTP数据格式…...

智启未来:当知识库遇见莫奈的调色盘——API工作流重构企业服务美学

目录 引言 一、初识蓝耘元生代MaaS平台 1.1 平台架构 1.2 平台的优势 1.3 应用场景 二、手把手教你如何在蓝耘进行注册 &#xff08;1&#xff09;输入手机号&#xff0c;将验证码正确填入即可快速完成注册 &#xff08;2&#xff09;进入下面的页面表示已经成功注册&…...