深入理解 C# 中的事件机制

本文深入探讨C#中的事件机制,阐述事件与委托的关系,解析事件模型的五个组成部分:事件拥有者、事件成员、事件响应者、事件处理程序和事件订阅。通过实例解析事件触发和处理流程,包括创建委托、关联事件、编写触发事件的代码、订阅事件和实现事件处理。此外,还介绍了EventArgs在事件中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:
对于搞.net的朋友来说,经常会遇到关于事件和委托的问题:事件与委托有什么关系?事件的本质是什么?委托的本质又是什么?由于.net 做了大量的封装,对于初学者,这两个概念确实不怎么好理解。事件是用户与应用程序交互的基础,它是回调机制的一种应用。举个例子,当用户点击按钮时,我们希望弹出一句“您好”;这里的【点击】就是一个事件;那么回调就是我们注册一个方法,当用户点击时,程序自动执行这个方法去响应这个操作,而不是我们时刻去监听用户有没有点击。

c# 中间的事件和委托是紧密联系在一起使用的。网上的很多博客都是用的窗体来介绍事件。但是窗体中事件基本都是微软提前构建好的,很多同学不能理解事件里面的参数也不太明白怎么去自定义时间。所以针对这些不足和自己学习的知识对事件的理解整理成一片文章,希望能够帮助到正在学习的同学。

一;事件的组成结构
事件:能够发生的什么,是一种类型的成员(属性,方法),它的功能就是通知
使用:用于对象或类间的动作协调与信息传递(消息推送)
原理:事件模型 发生----->响应的5个动作,-----------(1)我有一个事件—>(2)一个人或者一群人关心我这个事件 —>(3)我的这个事件发生了
—>(4)关心这个事件的人会被依次通知到—>(5)被通知到的人根据拿到的事件信息(又称“事件数据”,“事件参数”,“通知”)对事件进行响应(又称为"处理事件")

事件模型的五个组成部分:
1.事件的拥有着(event source,对象或类)
2.事件成员(event,成员),事件自己是不会主动的去通知别的对象,一定是被拥有着的某些内部逻辑触发以后他才会去通知别的对象。
3.事件的响应者(event subscriber,对象),订阅了事件的对象或者类,通俗的讲就是接收事件的类(这个类它需要接受到事件拥有着发出的事件中的参数来工作)
4.事件处理程序(eventHandler,成员) – 本质上是一个回调方法,他是属于事件的响应者的内部方法
5.事件订阅 — 把事件处理器(一个函数)与事件关联在一起,本质上是一种以委托类型为基础的约定(所以又称为事件是基于委托的)对象.事件 += new 委托(事件处理器)

以我们开篇的点击事件为例,对上面的五种组成部分做一下详细介绍
事件拥有着:按钮控件
事件:点击(点击这个动作就是一个事件,它不会自己触发,必须是我们用鼠标点击)
事件的响应者:拥有注册这个方法的类
事件处理程序:完成注册的程序(当事件发出后,被事件响应者所捕捉,捕捉到以后调用事件处理器)
订阅: 对象.事件 += new 委托(事件处理器)
按钮.clicked += new 委托(事件处理函数)

案例一:使用简单的定时器控件触发事件

using System;
using System.Security.Cryptography;
using System.Threading.Tasks;
using System.Timers;

namespace ConsoleApp210_22
{
   
    // 定义委托 函数的类型 它的主要作用是 指定了事件处理方法必须拥有的返回类型和参数
    public delegate void MessageHandler(string messageText,int num);

    public class Connection
    {
   
        // 定义事件 指定要使用的委托类型。
        // 这种方式声明了事件后,就可以引发它(使用和委托触发的方法)。理解:他是一个其返回类型和参数是由委托指定的方法一样。通过方法的调用来引用事件
        public event MessageHandler MessageArrived;
        private Timer pollTimer;

        public Connection()
        {
   
            pollTimer = new Timer(1000);
            pollTimer.Elapsed += new ElapsedEventHandler(checkForMessage);
        }

        public void Connect
### Prescan与Simulink联合仿真实现AEB自动紧急制动 #### 1. 构建仿真环境 为了实现Prescan与Simulink之间的有效通信,在启动Prescan之前需设置好两者间的接口参数。通过MATLAB命令`psOpenScenario('path_to_scenario')`加载预设场景文件,该操作初始化了整个模拟框架并准备接收来自Simulink模块的数据输入[^3]。 #### 2. 场景搭建 在Prescan环境中创建或导入所需的交通情景,包括但不限于道路布局、静态障碍物以及动态参与者(如行人或其他车辆)。这些元素共同构成了测试AEB性能的基础条件。对于特定类型的碰撞规避实验,比如城市交叉路口追尾事故预防,则应精心设计相应的虚拟场地来匹配实际应用场景的需求。 #### 3. 传感器建模 针对AEB系统的雷达、摄像头等感知设备,在Prescan内构建精确的物理特性描述及其工作原理模型。这一步骤至关重要,因为准确度决定了后续控制决策的质量。例如,当设定毫米波雷达探测范围时,不仅要考虑最大检测距离还要兼顾角度分辨率等因素的影响。 #### 4. 添加AEB控制系统 借助Simulink强大的图形化编程界面开发一套完整的AEB逻辑处理单元。此部分通常涉及多个子系统协同作业,像目标识别分类器负责区分前方物体属性;而速度调节机制则依据实时路况调整车速直至完全停止以避免潜在危险发生。具体来说,可以采用状态机架构表达不同阶段下的行为模式转换规律,并引入PID控制器优化响应曲线平滑性。 ```matlab % 定义AEB控制算法中的关键变量 function [brakeCmd, warningFlag] = aebControl(vRel, ttc) % vRel:相对速度;ttc:预计碰撞时间 if (ttc < TRESHOLD_TIME_TO_COLLISION && abs(vRel)>MIN_RELATIVE_SPEED) brakeCmd = MAX_BRAKE_FORCE; warningFlag = true; else brakeCmd = 0; warningFlag = false; end end ``` #### 5. 进行典型工况仿真 选取国际标准C-NCAP规定的几种常见行驶状况作为评估指标之一,执行多次迭代运行获取稳定可靠的统计数据用于分析评价所研发产品的优劣之处。特别注意的是每次试验前都要仔细校准各项初始参数确保结果具备可重复性和一致性特点。 #### 6. 结果展示与讨论 最后收集整理所有获得的信息绘制图表直观呈现出来便于进一步探讨改进方向。除了关注最终得分外还应该深入挖掘背后隐藏的技术细节问题所在从而指导未来的研究探索活动。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值