事件(event)和委托(delegate)的综合运用实例(WinForm控件事件执行流程和原理),和EventHandler委托

c#笔记5 详解事件的内置类型EventHandler、windows事件在winform中的运用 从响应用户操作来看事件,解释Windows事件。详细解析事件的用法语法和在图形化界面中触发的本质。 阅读详情

前言

关于委托前面已经写了:

C#中委托(delegate)和多播委托的理解
Action和Func泛型委托,委托,泛型,匿名函数,Lambda表达式的综合使用

其实初衷是为了解WinFrom中的控件或者COM组件中的各种事件运行的机制,里面涉及的知识整理起来还是比较多的,各种类型的委托,事件,和泛型等。

这里先整理事件(event),然后通过几个实例了解架构中的事件从激活到调用回调函数的具体过程。

事件(event)

事件的官方文档
事件基于委托,为委托提供了一种发布/订阅机制,

  1. 可将事件理解为一种特殊用途的委托,或者说是受限制的委托,是委托一种特殊应用;
  2. 事件里面其实就两个方法(即add_event()和remove_event())和一个私有的委托变量,这两个方法里面分别是对这个私有的委托变量进行的合并和移除,当调用事件的 += 时其实是调用的事件里面的add_event()方法,同样 -= 调用的是remove_event()方法;
  3. 事件只能够从对象外部增加新的响应方法和删除已知的响应方法,而不能主动去触发事件和获取其他注册的响应方法等信息。如果使用公有的delegate则不能做这些限制,也就是说事件对委托做了限制,使委托使用起来更加方便。

可以以下面这个图来理解:
事件的发布/订阅机制

从图中我们可以理解什么是发布者和订阅者,

且为什么说事件是特殊用途的委托,是受限制的委托?
限制一:不同于委托和类同级(可以在类的外边或者里边声明),事件只能在类中声明;
限制二:事件只能在声明该事件的类(发布者)中被调用,在订阅者中只能通过 <

C# Winform 自定义事件实战 在C#的WinForms中,自定义事件是一种强大的工具,它允许你创建自己的事件,从而在特定条件下通知订阅者。自定义事件通常用于封装业务逻辑,使代码更加模块化和易于维护。下面我将通过一个实战例子来展示如何在WinForms中创建和使用自定义事件。 阅读详情

相关推荐

C# Winform Button 控件 3 种点击事件绑定方式对比:委托 vs 事件 vs 属性面板

本文深入对比了C# WinForm中Button控件的3种点击事件绑定方式:委托、事件与属性面板。详细分析了每种方式的实现原理、优缺点及适用场景,帮助开发者根据项目需求选择最合适的绑定方法,提升代码可维护性和执行效率。

weixin_34341229的博客 381

C#委托与事件:从回调机制到事件驱动架构的核心原理与实战

在面向对象编程中,回调机制是实现模块间解耦和异步通信的基础技术。其核心原理是通过将方法作为参数传递或存储,允许程序在特定时机调用预先定义的操作,从而实现关注点分离。这一机制的技术价值在于提升代码的灵活性和可扩展性,是构建松耦合、高内聚系统的关键。在C#语言中,委托作为类型安全的函数指针,为回调提供了标准化实现;而事件则基于委托,通过封装和访问控制,构建了安全的发布-订阅模型。这种模型广泛应用于桌面UI开发(如WPF/WinForms的事件处理)、插件系统、日志框架和异步编程等场景。本文深入探讨了C#委托与事

weixin_34152820的博客 776

C#委托底层解析:_target、_methodPtr与_invocationList三字段揭秘

委托是.NET中实现回调与事件的核心机制,其本质并非语法糖,而是继承自MulticastDelegate的运行时对象。理解其底层原理需从三个核心字段切入:_target标识调用目标(实例方法为this引用,静态方法为null),_methodPtr存储方法本体的内存地址指针,_invocationList则决定单播或多播行为(null为单播,Delegate[]数组为多播)。这种结构设计支撑了委托链的Combine/Remove语义、执行顺序确定性及线程安全特性,并直接影响异步处理、GC行为与调试表现。在日

diaojin6880的博客 436

C#进阶核心:委托、反射、泛型与异步编程实战解析

在C#编程中,委托与事件是实现解耦和发布-订阅模式的关键机制,它们通过类型安全的函数指针和封装,为构建松耦合架构提供了基础。反射技术则赋予程序在运行时动态加载和操作类型的能力,是实现插件化架构和动态扩展的核心原理。泛型通过类型参数化,解决了代码复用和类型安全的问题,而协变与逆变进一步提升了API的灵活性。异步编程通过async/await状态机模型,不仅避免了界面卡顿,更优化了I/O密集型操作的资源利用率。这些技术共同构成了C#处理复杂业务逻辑、实现高性能应用和与外部系统(如数据库、串口、OPC服务器)交互

weixin_34301132的博客 530

C#进阶实战:异步编程、内存管理与反射泛型核心解析

在软件开发中,异步编程是提升应用响应性和吞吐量的关键技术,其核心原理在于通过状态机和协作式多任务模型,高效管理I/O密集型操作,避免线程阻塞。内存管理则涉及托管与非托管资源的交互,理解指针与平台调用(P/Invoke)机制对于高性能计算和原生库集成至关重要。反射与泛型作为元编程的基石,允许开发者在运行时动态操作类型信息,并在编译时确保类型安全,极大地增强了代码的灵活性与复用性。这些技术共同构成了现代C#工程实践的底层支撑,广泛应用于高并发Web服务、桌面应用开发、游戏引擎及跨语言互操作等场景。本文聚焦C#进

weixin_34239592的博客 304

C#运动控制卡驱动开发实战:从P/Invoke到上位机架构设计

在工业自动化与运动控制领域,上位机软件作为硬件设备与上层应用的关键桥梁,其核心在于实现稳定、高效的驱动通信。其基本原理是通过特定的通信协议(如PCIe内存映射、EtherCAT过程数据对象PDO)与运动控制卡等硬件进行数据交换,完成指令下发与状态反馈。这项技术的核心价值在于赋予开发者对控制链路的完全掌控权,能够灵活定制功能、优化性能,并实现与MES等复杂系统的深度集成。典型的应用场景包括数控机床、机器人轨迹控制以及高精度定位平台。本文聚焦于使用C#语言,通过P/Invoke技术封装原生DLL,构建一个具备异

djph26741的博客 434

winform委托和事件经典例子

winform委托和事件经典例子,委托 和 事件 winform 传值 子传父 父传子

.Net WInform开发笔记(五)关于事件Event

我前面几篇博客中提到过.net中的事件与Windows事件的区别,本文讨论的是前者,也就是我们代码中经常用到的Event。Event很常见,Button控件的Click、KeyPress等等,PictureBox控件的Paint等等都属于本文讨论范畴,本文会例举出有关“事件编程”的几种方法,还会提及由“事件编程”引起的MemoryLeak(跟“内存泄露”差不多),以及由“事件编程”引起的一些异常。引子: .net中事件最常用在“观察者”设计模式中,事件的发布者(subject)定义一个事件,事件的观察者(observer)注册这个事件,当发布者激发该事件时,所有的观察者就会响应该事件(表现为调

告别玄学:手把手配置EtherCAT从站PDI接口与同步采样(含Sync/Latch信号实战)

本文详细解析了EtherCAT从站PDI接口配置与同步采样技术,涵盖微处理器通信与直接驱动IO模式选择、同步采样四大触发模式(SOF、Latch_in、Sync0/Sync1)及输出触发实战。通过伺服驱动器实例,帮助工程师突破配置难点,实现高精度同步控制,提升工业自动化系统性能。

weixin_30667649的博客 481

USB设备识别码VID和PID详解:如何查询和自定义你的设备ID

本文详细解析了USB设备识别码VID和PID的核心作用、查询方法及自定义配置技巧。VID(供应商识别码)和PID(产品识别码)是USB设备的唯一身份证,用于驱动匹配和功能识别。文章提供了Windows和Linux系统下的查询方法,并探讨了如何合法获取和自定义VID/PID,适合硬件开发者和DIY爱好者参考。

weixin_29168675的博客 1441

从零开始学习信号完整性(SIPI)--2

上一节我们已经谈过,信号完整性研究的是如何使驱动器输出的信号传输到接收器件并被正确的接收。 信号完整性的三要素包含了:信号、驱动接收芯片、传输通道。 这其中信号是主体,我们要做的主要工作就是设计好信号的传输路径为信号的正确传输扫清障碍。要做信号完整性分析与设计首先要了解信号的特性,以及信号质量的判别标准。 对一个信号进行描述通常需要如下几个指标: 信号特性的描述 摆幅:信号从低电平到高电平之间的电压差,对于单端信号通常由信号的供电电压决......

qq_29476769的博客 2万+

红外基本数据观察需要用到的技巧

1.用ps查看Y8的数据,直接将Y8.raw格式拖动到ps中去。 2.用ps查看Y16数据,直接将Y16.raw拖动到PS中去。 3.Y16转Y8是将Y16的值(Y16的范围~32768–32767)映射到Y8的值(Y8的范围为0~255),步骤如下:1.按照Y16的大小排列并统计相同Y16出现的次数直方图; 2.根据抛点比例计算抛点个数,分别从前往后与从后往前...

阿锋的专栏 2627

vtk相机_分别用 VTK 体绘制和面绘制来实现医学图像三维重建;

序言,VTK介绍:VTK 全称为 The Visualization Toolkit (可视化工具),是一个开源、跨平台、自由获取、支持并行计算的图形应用函数;拥有3D 渲染的最新工具、提供3D交互模式以及2D绘图等。VTK 包含一个C++类库,目前提供了众多语言接口,例如 Java、Python、TCL;在三维函数库OpenGL 的基础上采用面向对象设计方法发展起来图形学基本概念和数据...

weixin_39665302的博客 687

基于ESP32和OV5640的目标检测系统

本文详细介绍了基于ESP32-S3和OV5640摄像头构建目标检测系统的完整方案。系统采用YOLOv8-Nano轻量级模型,通过INT8量化实现边缘部署,在UXGA分辨率下达到25fps帧率。文章从硬件选型、图像采集优化、模型量化部署、实时推理流水线构建等维度展开,重点解决了内存管理、电源稳定性和异常处理等嵌入式系统关键问题。该方案在资源受限条件下实现了150ms以内的端到端延迟,为物联网视觉应用提供了低成本、低功耗的解决方案,适用于智能家居、工业检测等多个场景。

reset2021的博客 329

DA14531之搭建开发环境

DA14531之搭建开发环境

hejinwu1314的博客 1777

【异常】Claude Code 第三方API 400报错(thinking type should be enabled or disabled)解决方案

摘要: Claude Code接入第三方API端点时出现400参数错误,主要因新版默认启用的Adaptive Thinking功能与旧版接口参数格式不兼容(需thinking: {type: "adaptive"},但第三方仅支持布尔值)。解决方案为修改本地settings.json配置文件,添加"CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING": "1"环境变量并重启客户端,即可恢复思考模式功能。Adaptive Th

奶爸的编程之路,也就一周冷个三天 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: Action<T>和Func<T>泛型委托,委托,泛型,匿名函数,Lambda表达式的综合使用
下一篇: Spring Boot入门(一)Spring Boot+IDEA+JDK1.8开发环境和第一个项目的搭建,附所需资源链接
define_YIDA
博客等级 码龄9年 323粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值