C#-事件之自我总结

C#事件实例详解 通过实例说明事件的定义、使用。并说明相关意义和使用技术及原因。 阅读详情
首先让我们先了解一下什么是回调函数
回调函数
1、什么是回调函数?
答:简单的说, 回调函数是一个通过函数指针调用的函数 。
2、为什么我们要使用回调函数?
答:调用者( Button类 )并不关心被调用者是谁;它所知道的是具有特定原型的被调用者(定义在主程序中的MyBtnClick方法)以及一些可能的限制(比如,返回值可以是整数,不过特定的值有特定含义)
举例 :
如果你想知道实践中回调函数多有用,想象一下你想写一个排序算法实现的库(的确很经典),比如冒泡排序,希尔排序,shake排序,快速排序等等。关注点在于为了是你的库更加通用,你不想嵌入排序逻辑(一个数组内两个元素之间哪一个在前)到你的函数中。你想让客户决定哪一种逻辑。或者说,你想让库对各种数据类型都有用(int,floats,strings) 等等。因此,你应该怎样做?你会使用函数指针并且利用回调。
总结 : 就是你写的函数让系统来调用
 
委托+事件      
    在系统事件中 , 如鼠标或键盘按下 , 发送器就是 .NET 运行库 ( 假设点了 Button 一下 , 那发送器就是 Button 类 ). 注意 , 事件的发送器并不知道接收器是谁 , 这就使得事件非常用用 .
    事件可以使用多播委托 , 但是 不能保证 调用方法的前后 顺序 .
    事件处理方法 不能有返回值 . 只要使用 EventHandler 委托就 必须使用 object 和 EventArtgs 参数 . object 是引发事件的 对象 , EventArtgs 包含有关事件的有用的 信息 .
    事件定义:
    事件触发者(如Button类)定义了一个函数指针(如下例中的委托myClick),这个函数指针可以在以后指向某个处理事件函数.当事件发生时,调用该函数指针指向处理函数,并将事件的上下文作为参数传入.处理完成后,控制权将被事件触发者回收.
自我理解 :
问 : 为什么事件要用委托实现 ?
答 : 就拿一个标准 Button 来说 , 当你点下去之后 , 会发生的内容在哪儿定义 ? 如果你进入到 Button 类里定义 , 好 ,Button 已经被比尔这家伙封装了 , 你可进不去 , 进去了也不能修改 ; 咋办昵 ????? 算了 ,Button 哭着对 主程序 ( 假设当前主程序是一个 Win Form) 说 , 你做我的代理 , 帮我完成吧 . 由此 , Button 将它的 Click 事件委托给了主程序 . 这下你可以在 Form 里为所欲为了 , 让它干什么 , 它就得干什么 ?(Button:" 主程序,你是禽兽 ... "; 主程序:"哇哈哈哈,这可由不得你啦...(屏幕漆黑中...)" )
网友理解 :
1、委托就是代理 . 如果你是厂商,假如要你直接去卖你的产品,那你将面对的是所有的消费者 . 假如你依靠代理卖你的产品,那你将面对的仅仅是各个省或地区的代理。
2、委托是一种特殊的类型(class),用途是来实现对一种方法的封装,在某种事件发生时,自动调用该方法。好处显然易见,它使用户可以 自定义自己的方法实现( 就是前面所说的为所欲为 ) ,通过封装,CLR会在相应事件激发时调用你定义的方法,实现你的功能。
3、认为是函数指针的是C/C++程序员,理解基本正确,但有一点,委托可以是"成员函数的指针"。认为是类的,没错,.NET里什么都是类,委托类包含了一个对象(o)和对象中一个方法(m)的信息,实现了调用这个方法(o.m())的方法(委托的调用)。说用委托来实现类的组合,这个观点不敢苟同。类的组合应该是两个完整的类,如果通过委托把一个类的部分方法和其它类组合应该是不完全的。
using  System;
using  System.Collections.Generic;

public   class  MyClass
{
    
public static void Main()
    
{        
        MyClass mc 
= new MyClass();
        myButton godBtn 
= new myButton();
        godBtn.myClick 
+= new EventHandler(mc.godBtnClick);
        godBtn.OnmyClick();
        
        Console.ReadLine();    
    }
        
    
public void godBtnClick(object sender,EventArgs e)
    
{
        Console.WriteLine(
"on my god...button");
    }

}


public   class  myButton 
{
    
public event EventHandler myClick; //一个委托事件 myClick
    protected void OnmyClick() //注意,最好使用protected修饰符,以便只给继承它的类使用
    
{
        
if(myClick != null)
        
{
            myClick(
this,new EventArgs());
        }

    }

}

 
定义实现一个事件的流程
1 、引发事件的对象称 事件源 ;
2 、事件总是委托类型的 , 这个委托类型的签名定义了处理该事件的方法的签名 ;( 如my Click)
3 、定义事件处理程序方法的对象称 事件接收方(就是主程序此例为MyClass) ;
4 、事件接收方提供的事件处理方法必须与该事件预订的方法签名一致 . ( 如godBtnClick)
5 、在事件的通信中 , 事件发送者不知道哪个对象或方法将要去接收 / 发送事件 , 因而在事件源和事件接收者之间就需要一个中间人 - 委托 ;
6 、当指派多个处理程序给一个事件的时候 , 处理程序的调用次序是没有保证的 .(多播委托 )
7 、 EventHandler 是一个用于事件的委托 , 它有两个参数 object 和 EventArg,object 代表了事件的发送者 ,EventArg 对象代表了事件包含的数据 ;
8 、所以有事件处理方法都可以使用 EventHandler, 但你也可以使用 EventHandler 的子类 .( 如 public event PaintEventHandler Paint; 其实 PaintEventHandler 是 EventHandler 的子类 )
 
1) 定义事件 ( 变量 )  public event EventHandler myClick;
2) 定义事件方法   public static void godBtnClick( object sender, EventArgs e);
3) 将事件与事件方法相关联   mc.myClick+= new EventHandler(godBtnClick); //EventHandler 是一个委托,委托通常把方法当参数传递, btnGetClick 是一个方法
4) 定义响应函数   public void OnmyClick()
5) 调用响应函数 , 响应函数调用触发函数 , 事件被触发了   mc.OnmyClick();
  注 : 在系统定义的响应事件中 , 第 4) 5) 步是不可见的 .
C# 事件(Event) C# 事件(Event)是一种成员,用于将特定的事件通知发送给订阅者。事件通常用于实现观察者模式,它允许一个对象将状态的变化通知其他对象,而不需要知道这些对象的细节。基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。C# 中使用事件机制实现线程间的通信。event+=-= 阅读详情

相关推荐

C#与RPA:构建高效智能的自动化系统实践指南

C#与RPA结合实现企业高效自动化 摘要:本文探讨C#与机器人流程自动化(RPA)技术的结合应用。C#作为企业级开发语言,通过与UiPath等RPA平台集成,可实现复杂业务流程自动化。文章详细介绍了开发流程:首先选择合适的RPA工具平台,然后使用C#编写定制化脚本处理业务逻辑,实现与数据库、Excel等外部系统的交互。特别强调了C#与AI技术(如ML.NET)结合,使RPA具备智能决策能力。这种技术组合为企业自动化提供了强大支持,既能执行规则明确的任务,又能进行预测分析和动态决策,显著提升业务效率和准确性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1299

自研RPA:C#编写Windows屏幕自动解锁

自研RPA:Windows屏幕自动解锁

weixin_44358694的博客 3355

c#开源的rpa源码,可供大家学习和交流

c#开源的rpa源码,可供大家学习和交流,适合有一定知识储备的开发人员

RPA(机器人流程自动化)调研

​ 机器人流程自动化(Robotic process automation,简称RPA)是以软件机器人及人工智能(AI)为基础的业务过程自动化科技。 机器人流程自动化(RPA)系统是一种应用程序,它通过模仿最终用户在电脑的手动操作方式,提供了另一种方式来使最终用户手动操作流程自动化。 说白了就是用机器代替重复的人为动作。 ​

scofild950303的博客 8767

sharpRPA:建立在.NET上的免费,开源且易于使用的RPA(机器人过程自动化)-不要编写代码,不能构建功能

夏普RPA 请注意,该项目目前处于Alpha(预览)状态,并且可能会更改。 sharpRPA是基于C#的.NET Framework构建的免费,开源且易于使用的RPA(机器人过程自动化)解决方案。 sharpRPA使您可以轻松地自动执行直接重复性操作-无需编写代码,无需构建功能! 开始画面 完成的脚本示例 以下是一些已构建的示例脚本的示例。 要求功能 找不到所需的自动化功能吗? 不想建立自己的? 单击查看最新版本。 发布二进制文件以Visual Studio“发布”模式构建,并打包为.ZIP文件。 只需将其提取到一个文件夹中,双击并运行即可开始。

rpa.challenge.csharp.selenium:Seleniumwebdriver中的C#机器人来处理RPA Challenge网站

rpa.challenge.csharp.selenium Seleniumwebdriver中的C#机器人来处理RPA Challenge网站 重要的提示 您将看到此项目创建的类和包太多,无法满足您的大小但是,使用这种数量的类创建的目的仅仅是为了测试对RPA的新项目模式的实现因此,Selenium项目必须具备的每个功能和职责都在各自的类中 构架 Selenium Webdriver Selenium Chrome Webdriver 铁XL Excel

C#控件的事件重写的理解与自我观点

由于我是从VFP开发转往C#开发的,所以常常想在C#理去实现VFP中的一些写法,例如这次.. 在VFP中,我们的为了适应开发的多变性,所以我们开发了很多继承于VFP控件的类控件,把很多常用的处理代码,写在了类控件中,那么只要把类控件加到Form中,就已经拥有样关功能了....如果某个事件不想继承类的,只要隐藏一下,就可以实现了,例如,我有一个类控件UTextBox是继承TextBox开发的

同一天空下 6165

Ubuntu无桥接模式或连不上网(详细解决方法

目录 问题1:Ubuntu没有未桥接的主机网络适配器 解决方法 1.打开VMware安装目录下的文件 ​编辑2.右键安装以上三个文件 3.打开网络状态属性,找到VMware bridgeProtocol,点击安装 问题2.Ubuntu桥接模式连不上网 1.win+r打开cmd终端,输入ipconfig /all 2.记录以下数据 3.打开VMware网络设置 问题1:Ubuntu没有未桥接的主机网络适配器 VMWare安装之后,虚拟网络一直使用默认配置 VMnet0为...

m0_65592409的博客 6062

您应该知道的5种避免C#.NET中事件造成的内存泄漏的技术

C#(通常是.NET)中的事件注册是内存泄漏的最常见原因。至少从我的经验来看。实际上,我从事件中看到了太多的内存泄漏,因此 在代码中看到 + = 将立即使我感到怀疑。 尽管事件很常见,但它们也很危险。如果您不知道要查找的内容,则事件很容易导致内存泄漏。在本文中,我将解释此问题的根本原因,并提供几种最佳实践技术来解决该问题。最后,我将向您展示一个简单的技巧,以找出您是否确实存在内存泄漏。 了解内存泄漏 在垃圾收集环境中,术语“内存泄漏”有点反直觉。当有一个垃圾收集器负责收集所有内容时,我的内存如何泄漏? 答案

极客神殿 1290

Materials Studio多层聚合物建模全流程:从Build Layers到LAMMPS data文件导出避坑指南

本文详细解析了使用Materials Studio构建多层聚合物模型并导出为LAMMPS data文件的全流程。重点剖析了Build Layers工具的核心逻辑、真空层处理技巧,并提供了解决导出过程中Z轴坐标偏移问题的实战方案,特别是如何利用msi2lmp工具的-shift参数进行精准校正,确保模型在LAMMPS中模拟的稳定性和准确性。

hhh00的博客 913

基于 YOLO + SAM 的自动图像标注实战

摘要: 本文提出一种基于YOLO检测和SAM分割的自动化数据标注流水线方案,通过YOLO定位目标并生成检测框,再以检测框为提示驱动SAM完成精细分割,最终输出YOLO格式的标注文件。该方案将人工标注升级为半自动流程,显著提升标注效率,尤其适用于多类别、大规模图像的实例级标注需求。代码模块化设计支持模型灵活替换,并集成异常处理与进度可视化功能。虽依赖YOLO检测质量且对小目标存在局限,但作为工程落地方案,可有效降低私有数据集构建成本,适用于工业检测、遥感等场景的冷启动标注。

qq_64366203的博客 1144

C#中委托和事件

关于委托和事件分享三个博客内容: 首先说明下: (1)C#中事件:事件时属于类的成员,所以要放在类的内部。 (2)委托属于一个定义,是和类、接口类似的,通常放在外部。 (因为大多数委托都要被重用) 委托定义在类里面还是类外面视情况而定,一般定义在与类定义平级部分, 且用public修饰,便于外部调用。 若定义在类的内部,则必须通过调用该类的成员才能取得其委托的引用, 频繁...

andu1644的博客 1万+

华硕笔记本键盘失灵恢复方法全解析

华硕笔记本键盘失灵问题可能由多种原因导致,但大多数问题都可以通过上述方法得到解决。在尝试恢复键盘功能时,请务必按照步骤操作,并注意备份重要数据。如果问题依然存在,请寻求专业维修人员的帮助。希望本文能够帮助大家快速解决华硕笔记本键盘失灵的问题!

mmoo_python的博客 4227

【C#进阶】C# 事件

🌍 hello大家好啊,我是哈桑。本文为大家介绍 C# 中的事件。事件本质上来讲是一种特殊的多播委托1,只能从声明它的类中进行调用。事件通常用于表示用户操作,例如单击按钮或图形用户界面中的菜单选项。C# 中常常会使用事件来实现线程之间的通信。不仅是在类中,在接口中也可以声明事件,称为接口事件。接口事件的实现和接口上的方法或属性的实现是一样的,以一个示例来说明如何在类中实现接口事件。

好学若饥,谦卑若愚。 5302

Kimi K3大模型API实战:从调用到本地知识库问答系统构建

大语言模型(LLM)作为人工智能的核心技术,通过海量数据训练获得理解和生成自然语言的能力。其工作原理基于Transformer架构,通过自注意力机制捕捉长距离依赖关系。这项技术的核心价值在于能够将非结构化文本转化为可计算、可交互的智能体,极大地提升了信息处理和自动化任务的效率。在应用场景上,大模型广泛应用于智能对话、代码生成、文档总结与问答等领域。其中,国产大模型如月之暗面推出的Kimi K3,凭借其在**长文本处理**和**中文场景优化**方面的优势,为开发者提供了新的技术选项。本文将以Kimi K3为例

weixin_30694389的博客 299

基于Multisim的模电调幅发射机仿真设计

振荡器产生的高频信号的功率很小,所以有必要对高频信号进行功率放大,有利于信号的调制发射。缓冲电路将主振荡器和高频功放电路相隔离,以减小功放电路对主振荡器的影响。缓冲电路可以用射极跟随器电路来实现,其作用就是前后级的阻抗相互匹配,减小前后级的影响。总电路的仿真结果见下图:示波器1~4分别是主振荡器、缓冲电路、高频放大电路和调幅电路的输出波形。由于载波频率稳定度≤10-3,所以可以采用并联型改进电容反馈式三端振荡器(Seiler电路)谐振回路,滤除其他频率的成分,得到与载波(假设。(1)缓冲电路的设计与实现。

Eve223322的博客 4575

C# 委托与事件总结

C# 中的委托和事件可以说是超级拦路虎了,一个不小心就容易让人直接放弃学习。最近几天花了点时间钻研了一下,查看了一些资料,希望做个总结。 我还达不到技术大佬的级别,主要就是做个**自我总结**,很推荐大家看一下我下面发的参考资料里的文章和视频,那些是真正的大佬产出的内容。

萌宅鹿的技术小屋 2613

【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1314

C# 事件

事件是依赖于委托,没有委托无法创建。

一个有料的码农 3255

华为OD机试真题 新系统2026-04-15 Python&JS 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 523

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[C#]C# 事件(event)

事件是一种特殊的多播委托,仅可以从声明事件的类或结构中对其进行调用。类或对象可以通过事件向其他类或对象通知发生的相关事情。发送(或引发)事件的类称为“发布者”,接收(或处理)事件的类称为“订阅者”。本文主要介绍C# 事件(event)。

FL1768317420的博客 1148

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: C#-string类的索引的个人想像
下一篇: 测试-为“日”字加一笔,你第一反应是什么字?
MasterFT
博客等级 码龄20年 48粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值