当前位置: 首页 > 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的实现…...

V数据库设计

一、章节核心定位第二章通常是数据库设计的需求分析与概念结构设计阶段&#xff0c;是整个数据库设计流程的核心起点&#xff0c;直接决定后续逻辑结构、物理结构设计的合理性&#xff0c;是从业务需求到数据模型的关键转化环节。二、核心知识点梳理1. 需求分析阶段&#xff08…...

保姆级教程:手把手教你理解电力线载波通信的MAC帧与MPDU(附避坑指南)

电力线载波通信MAC帧与MPDU实战解析&#xff1a;从协议规范到调试避坑 电力线载波通信&#xff08;PLC&#xff09;技术凭借其"无需额外布线"的天然优势&#xff0c;在智能电网、智能家居等领域持续渗透。但当你真正打开协议文档准备调试时&#xff0c;那些密密麻麻的…...

银行家算法实战:用Python模拟死锁避免过程(附完整代码)

银行家算法实战&#xff1a;用Python模拟死锁避免过程&#xff08;附完整代码&#xff09; 在操作系统的资源管理领域&#xff0c;死锁问题就像程序员的噩梦——四个进程围坐在圆桌前&#xff0c;每个都紧握着别人需要的资源&#xff0c;却固执地不肯松手。这种僵局不仅会导致…...

python绘制智能网格天气预报产品

python绘制智能网格天气预报产品 1.产品说明 智能网格天气预报业务化下发产品包括&#xff1a; PRE/GUST/FOG/HZ/SNOW/TMAX/TMIN/VIS/R24/RH/CLOUD/TA/TMP/WIN/PRS/TCC/SAND/SOIL/SUNLIGHT/HOURS: 固定代码&#xff0c;表示产品内容是降水/阵风/雾/霾/积雪/最高气温/最低气温…...

第6章 数据类型转换-6.7 转换为字典

通过使用dict()函数可以将列表或元组转换为字典。其语法格式如下&#xff1a;dict([x])其中&#xff0c;参数x为可选参数&#xff0c;表示列表或元组&#xff0c;且该列表或元组必须是键值对形式&#xff0c;如果省略该参数&#xff0c;则该函数返回空字典。示例代码如下&#…...

品牌想被AI推荐,必须满足这3个条件

我们团队去年给一家智能家居客户做GEO交付&#xff0c;第一个月内容铺了三千篇&#xff0c;数据后台一打开&#xff0c;引用率不到1.7%。客户电话直接打过来问&#xff1a;“你们是不是把同一篇文章&#xff0c;用AI换了个说法发了三千遍&#xff1f;”这就是很多营销服务公司踩…...

安装---Low-E玻璃采光真的很差吗?

安装---Low-E玻璃采光真的很差吗? 现如今家装门窗,玻璃在整窗的占比越来越高,大视野好采光成了业主的主流需求之一,依然有提问,说自家装了Low-E玻璃,但觉得家里暗了,可卖家说正常,没问题! 我们的上帝-消费者从来不想做选择题,在同样价格的基础上,能获得的越多越好。…...

避坑指南:QML调用C++时那些让你debug到崩溃的隐藏问题(Qt5/6通用)

QML与C交互避坑实战&#xff1a;信号槽、内存管理与类型转换的终极解决方案 第一次在QML中调用C对象时&#xff0c;那种跨语言调用的兴奋感很快会被各种诡异问题冲淡——信号死活不触发、对象莫名其妙被销毁、类型转换时程序崩溃...这些问题往往让开发者陷入数小时的debug泥潭。…...

3步实现飞书文档高效转换:Cloud Document Converter全场景解决方案

3步实现飞书文档高效转换&#xff1a;Cloud Document Converter全场景解决方案 【免费下载链接】cloud-document-converter Convert Lark Doc to Markdown 项目地址: https://gitcode.com/gh_mirrors/cl/cloud-document-converter 一、三大痛点&#xff1a;飞书文档管理…...

GTE-Pro企业级语义智能实战:从模型加载到热力评分可视化的完整链路

GTE-Pro企业级语义智能实战&#xff1a;从模型加载到热力评分可视化的完整链路 1. 引言&#xff1a;告别关键词匹配&#xff0c;拥抱语义理解 想象一下&#xff0c;你是一个新员工&#xff0c;想查一下公司怎么报销餐费。你打开公司的知识库&#xff0c;输入“怎么报销吃饭的…...