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

news2025/4/14 21:20:16

一、初步了解事件

定义:单词 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,不然又成了可以”借刀杀人“了

事件的命名约定

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

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

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

相关文章

数据可视化大屏人员停留系统的开发实录(默认加载条件筛选、单击加载、自动刷新加载、异步加载数据)

项目需求 录入进入房间的相关数据;从进入时间开始计时,计算滞留房间的时间;定时刷新数据,超过30分钟的人数,进行红色告警; 实现流程 为了完整地实现上述需求,我们可以按照以下步骤开发&#…

Log4j2漏洞复现补丁绕过

漏洞复现 这里我一共使用了两个jdk版本 8u202的情况比较特殊,其实我今天凌晨在家里用的也是8u202的版本,失败了。今天来公司也是用的8u202版本的jdk,成功了。我仔细研究了两者的不同,我发现唯一不同的就是我公司这个idea启的proie…

NLP——分布式语义 Distributional Semantics:Word Vectors;Word2Vec

文章目录 传统语义数据集的缺点分布式语义Word Vectors 词向量Count-based 基于统计的方法Document 作为上下文 —— 向量空间模型(VSM)TF-IDF 更加有效的编码方式降维Singular Value Decomposition neighbor words 作为上下文 基于深度学习的方法Word2V…

highlight clock tree 高亮时钟树的方法

当分析clock tree需要在图形界面highlight clock tree时,最朴实无华的方法就是贴报告,除此之外这里也分享一下用命令的方法。 1.Imported Path Pins 1)Highlight > Color By > Imported Path Pins 2)report_timing icc2…

【MySQL 数据库】9、存储过程

目录 一、存储过程是什么二、存储过程的基本语法三、MySQL 中的变量(1) 系统变量(2) 用户自定义变量(3) 局部变量 四、if 判断五、参数传递和返回值六、case 语句七、while 循环八、repeat 循环九、loop 循环十、游标十一、条件处理程序 一、存储过程是什么 🌱 存储…

Linux进程间通信【消息队列、信号量】

✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌇前言🏙️正文1、消息队列1.1、什么是消息队列?1.2、消息队列的数据结构1.3、消…

交通物流模型 | Python实现基于张量分解的交通流量时空模式挖掘(出租车车载GPS数据、公交卡刷卡数据、POI的分布数据)

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 一般出行行程通常都由某种明确目的驱使,例如上班、购物或娱乐,出行的起始区域因其承担功能的不同,通常能够反映出用户的出行目的,于此同时,从宏观来看,区域之间的交通流量在一天内的变化规律也能够反…

【数据结构与算法】03 队列(顺序队列--循环队列--优先级队列--链队列)

一、概念1.1 队列的基本概念1.2 队列的顺序存储结构1.21 顺序队列(静态队列)1.22 循环队列1.23 优先级队列 1.3 队列的链式存储结构 二、C语言实现2.1 顺序存储2.11 顺序队列2.12 循环队列2.13 优先级队列 2.2 链式存储 一、概念 1.1 队列的基本概念 队…

【python】—— python的基本介绍并附安装教程

前言: 今天,我将给大家讲解关于python的基本知识,让大家对其有个基本的认识并且附上相应的安装教程以供大家参考。接下来,我们正式进入今天的文章!!! 目录 前言 (一)P…

【Linux】互斥量原理的实现

深刻理解互斥锁 文章目录 前言一、demo版的线程封装二、demo版的锁封装总结 前言 为了实现互斥锁操作 , 大多数体系结构都提供了 swap 或 exchange 指令 , 该指令的作用是把寄存器和内存单元的数据相交换, 由于只有一条指令 , 保证了原子性 , 即使是多处理器平台 , 访问内存的总…

第10讲:深入剖析 Agent 插件原理,无侵入性埋点

AbstractClassEnhancePluginDefine 核心实现 在开始之前,先简单回顾上一课时中关于 AbstractClassEnhancePluginDefine 的一个核心知识点:AbstractClassEnhancePluginDefine 是所有插件的父类,SkywalkingAgent.Transformer 会通过其 enhance…

信号完整性:反射

反射是怎么形成的 信号的反射和互连线的阻抗密切相关。反射的最直接原因是互连线的阻抗发生了突然变化,只要互连线的阻抗不连续的点,该处就会发生反射。 信号是以电磁波的形式在走线中传播的,如果从传统的电路理论角度去看,是无…

YOLOv5使用自定义数据集实验

上一篇博文中介绍了YOLOv7训练自定义数据集,在这篇文章中,我们主要记录YOLOv5模型的实验过程,用于对比实验。 YOLOv5与YOLOv7毕竟一母同胞,因此部署起来也是极为类似。 数据集 数据集使用的与YOLOv7的实验数据集一样,…

windows服务器自带IIS搭建网站并发布公网访问

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 转载自远程源码文章:【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网…

VS2019生成和使用lib、dll文件

叠甲:本文非常简略,方法非常朴素,仅供参考。 目录 lib文件 生成lib文件 使用lib文件 dll文件 生成dll文件 使用dll文件 lib文件 生成lib文件 新建项目libTest。 右键项目→属性→配置属性→常规→配置类型,选择“静态库…

【Java】表白墙终章-飞流直下的“甜言蜜语”-瀑布流式布局

飞流直下三千尺! 文章目录 【Java】表白墙终章-飞流直下的“甜言蜜语”-瀑布流式布局1. 效果前后对比2. 瀑布流式布局原理思想3. 约定前后端接口4. 后端代码4.1 修改Love类的定义4.2 修改doPost方法4.3 修改save方法4.4 修改doGet方法4.5 修改load方法 5. 前端瀑布流…

面试总结个人版

一、面试题 java 集合 , spring springmvc springboot springcloud 数据库相关的, redis 相关 ,mq 相关 ,结合业务的场景题 1、part one 集合 HashMap底层原理 HashMap是基于哈希表的Map接口的非同步实现。元素以键值对的形式存…

asp.net教师调课系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net教师调课管理系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言开发 asp.net教师调课系统VS开发sqlser…

deadline用WebService提交Job

官方文档 网站链接 进入rest API,点击jobs,找到submit job 这里可以看到消息体需要用到JobInfo和PluginInfo这两个关键的字典(json object) 拿到对应的键值对 为了填写url请求的消息体 我们需要拿到必须参数的键值对 点击双击…

如何延长电脑硬盘的使用寿命?

在日常使用电脑过程中,一定要做好硬盘的保养和维护,一旦硬盘损坏,保存在硬盘上的数据就会丢失,而且找回数据也是一件很费功夫的事情,甚至有可能永远也找不回来。所以日常工作中定期对资料进行备份,做好电脑…