C#委托与事件的本质区别

2023-05-16

C#委托与事件的本质区别

从定义上说,委托被编译器编译成一个类,所以它可以像类一样在任何地方定义,
而事件被编译成一个委托类型的私有字段和两个公有add 和 remove 方法(有点类似于属性的定义)不过这两个方法都有一个参数,这个参数就是委托,所以,它只能定义在一个类里面。

从定义可知,委托是要是需要实例化的,它4个方法:一个构造器,Invoke,BeginInvoke和EndInvoke。

构造器有两个参数分别是:一个对象引用,
另一个是引用回调方法的一个IntPtr。然而实例化委托的代码的参数只是一个方法的引用。
但这不是问题,编译器明白这其中的一切会获取对应的参数。
 

然而事件是不需要实例化的因为他只是一个字段和两个方法,只是类的一些成员,但是可以初始化,通过一些赋值操作!

实例化委托时,定义他参数的方法的参数及返回类型必须符合委托的Invoke参数及返回类型,而事件被定义后,它可以通过方法所在类的对象调用add方法来添加一个委托和remove方法来移除一个委托!

而两个方法的结果是返回一个委托引用并赋值给事件定义生成的私有委托字段,如果是多次调用就返回一个委托列表头的引用。而传入的这个参数即是由要触发的方法而封装的委托。

(参数为什么是委托而不直接传入一个方法引用呢,这样效率不是更高吗)因为委托是调用回调方法的一种类型安全的方式。

通过add方法即是订阅了一个事件,然后就是触发事件了,即通过点击按钮等输入操作即可触发事件,然后调用私有的委托变量,然后即像调用委托一样,调用他的Invoke方法即引用定义的方法的地址来执行该方法,然后这个事件就结束了。

  总结:事件的订阅分两个阶段:首先是传入的参数(即委托)的实例化,相当于委托的实例化,调用该委托的构造函数(一个对象引用,一个IntPtr类型的回调方法的引用),其次就是委托链(也即多播委托)的构建过程,第一次订阅是用一个null和传入的委托的Combine,此时直接返回传入的委托地址,如果第二次订阅就会构造一个新的委托对象,_invocationList字段被初始化为一个委托对象数组,引用两个委托地址,最后返回这个新建的对象地址,以后依此类推。

  接下来就是事件的触发阶段了,通过鼠标单击或动态用代码去实现,其本质只有一个步骤即委托的调用,如果只有一个委托,直接调用Invoke方法,如果有多个委托,即发现_invocationList不为null,会循环调用数组里的所有元素,每个元素的实现即为只有一个委托时调用的Invoke方法。

    简而言之,即事件分为两个阶段一个是委托的实例化(对应事件订阅),一个是委托的调用(对应事件触发)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#委托与事件的本质区别 的相关文章

  • 经典激光雷达SLAM系统:LOAM-Livox

    作者 密斯特李 编辑 汽车人 原文链接 xff1a https zhuanlan zhihu com p 515732721 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之
  • SLAM中姿态估计的图优化方法比较(g2o/Ceres/GTSAM/SE-Sync)

    编辑 深蓝AI 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 后台回复 SLAM综述 获取视觉SLAM 激光SLAM RGBD SLAM等多篇综述 xff01 本文是对论文 A Compari
  • 多传感器融合 | 详解PointPainting和MVP

    作者 谷溢 编辑 深蓝AI 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心技术交流群 后台回复 多传感器融合综述 获取图像 激光雷达 毫米波雷达融合综述等干货资料 xff
  • 2022最新!视觉SLAM综述(多传感器/姿态估计/动态环境/视觉里程计)

    目录 摘要 视觉SLAM算法的发展 相关综述 VSLAM 设置标准 传感器和数据采集 目标环境 视觉特征处理 系统评估 语义等级 基于主要目标的VSLAM方法 目标一 xff1a 多传感器处理 目标二 xff1a 姿态估计 目标三 xff1
  • 自动驾驶路径规划五大常用算法(Dijkstra/人工势场/图搜索等)

    编辑 希骥智能网联汽车 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心 规划控制 技术交流群 后台回复 规划控制综述 获取自动驾驶 智能机器人规划控制最新综述论文 xff
  • 论文汇总!物体级SLAM(定位/建图/重定位/回环检测)

    作者 黑桃K 编辑 汽车人 原文链接 xff1a https zhuanlan zhihu com p 570562248 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心
  • VSLAM与VIO的3D建图,重定位与世界观综述

    作者 紫川Purple River 编辑 汽车人 原文链接 xff1a zhuanlan zhihu com p 592225457 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自
  • 3D激光雷达-IMU的无目标外参标定

    点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心 全栈算法 技术交流群 后台回复 相机标定 获取超详细的单目双目相机模型介绍 内外参标定算法原理视频 xff01 摘要 xf
  • 力扣刷题路线-c++学习笔记(1)

    1 数组 数组的在内存空间的地址是连续的 xff0c 所以我们在删除或者增添元素的时候 xff0c 就难免要移动其他元素的地址 如下所示 数组的元素是不能删的 xff0c 只能覆盖 可以看出在C 43 43 中二维数组在地址空间上是连续的
  • 最新Benchmark | 4Seasons:面向挑战场景的自动驾驶视觉SLAM基准

    点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心 SLAM 技术交流群 后台回复 4Seasons 获取论文和数据集下载地址 xff01 xff01 xff01 1摘要 论
  • 20余家自动驾驶规控岗位技能知识点梳理

    规划控制是自动驾驶的核心模块之一 它的主要作用是 xff1a 无人车在感知到周边环境的基础上 xff0c 结合车辆自身的目的地 当前位置以及地图信息 xff0c 对车辆自身做出最合理的决策动作 决策后 xff0c 车辆会规划一条新的轨迹 x
  • 视觉大模型 | SEEM:比SAM更强!

    作者 派派星 编辑 CVHub 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心 语义分割 技术交流群 Title Segment Everything Everywher
  • 自动驾驶之多传感器融合--相机与IMU的同步

    作者 韦韦道来 编辑 韦心雕AI 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心 多传感器融合 技术交流群 后台回复 多传感器融合综述 获取图像 激光雷达 毫米波雷达融合
  • STM32---BOOTLOADER

    1 什么是Bootloader Bootloader是硬件启动的引导程序 xff0c 是运行操作系统的前提 在操作系统内核或用户应用程序运行之前运行的一段小代码 对硬件进行相应的初始化和设定 xff0c 最终为操作系统准备好环境 2 Boo
  • apt切换为国内镜像

    ubuntu debian切换为国内镜像 span class token comment 备份原镜像文件 span span class token function cp span etc apt sources list etc ap
  • opencv: error while loading shared libraries问题的解决

    ARM 开发板运行程序 xff1a error while loading shared libraries lib libopencv core so cannot open shared object file No such file
  • Ubuntu20.04双系统/boot扩容的一种方法

    目录 1 压缩卷 xff08 如果磁盘存在足够 未 分配空间则不需要 xff09 2 创建新的磁盘分区 3 挂载新的磁盘分区到boot 1 压缩卷 在Windows下使用磁盘管理 xff08 开始 gt 右键 gt 磁盘管理 xff09 工
  • 【C语言】输入一个5位数,依次输出各个位的数字

    输入一个5位整数 xff0c 依次输出各个位的数字 span class token macro property span class token directive keyword include span span class tok
  • 【C语言】四种方式使用C语言输出杨辉三角前10行

    杨辉三角第一列和对角线为1 xff0c 其他的计算公式为 a i j 61 a i 1 j 1 43 a i 1 j 实现杨辉三角输出有多种方式 xff0c 本文提供其中的四种实现方式 方式一 span class token macro
  • ros与stm32串口通信

    一 安装ROS串口驱动 安装ROS串口 sudo apt get install ros melodic serial 安装完后在一个新的终端里输入 roscd serial 如果能够正常cd到 opt ros melodic share

随机推荐

  • 【python】pyQT5中ComboBox的用法

    pyQT5中ComboBox的用法 常用的方法 1 添加下拉选项 span class token comment 添加一个下拉选项 span self span class token punctuation span comboBox
  • 【树莓派】解决树莓派4B不连接显示器开机后,用VNC无法显示画面 (cannot currently show the desktop)问题

    树莓派4B不连接显示器开机后 xff0c 用VNC无法显示画面 xff08 cannot currently show the desktop xff09 原因 树莓派没接显示器时 xff0c 执行的是默认分辨率 xff0c 这个分辨率VN
  • 【C语言编程练习】输入一个正整数,逆序输出各位数字

    题目 输入一个正整数 xff0c 逆序输出各位数字 例如输入 xff1a 568 xff0c 输出8 6 xff0c 5 题目解析 首先输出个位数字 xff0c 需要提取出来各位数字 xff0c 对于一个正整数来说 xff0c 提取个位数字
  • 【C语言编程】古典问题:韩信点兵

    题目 韩信有一队兵 xff0c 他想知道有多少人 xff0c 便让士兵排队报数 xff1a 按从1至5报数 xff0c 最末一个士兵报的数为1 xff1b 按从1至6报数 xff0c 最末一个士兵报的数为5 xff1b 按从1至7报数 xf
  • 【ChatGPT】使用ChatGPT进行51单片机程序编程体验

    背景 最近ChatGPT大火 xff0c 笔者尝试使用它进行了51单片机编程尝试 ChatGPT是一种由OpenAI训练的大型语言模型 xff0c 具有强大的自然语言处理能力和生成代码的能力 使用ChatGPT进行51单片机编程 xff0c
  • 【C语言】两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。排出比赛名单

    题目 两个乒乓球队进行比赛 xff0c 各出三人 甲队为a b c三人 xff0c 乙队为x y z三人 已抽签决定 比赛名单 有人向队员打听比赛的名单 a说他不和x比 xff0c c说他不和x z比 xff0c 请编程序找出三队赛手的名单
  • 【C语言】输出所有的水仙花数

    题目 输出所有的水仙花数 xff0c 所谓的 水仙花数 指一个3位数 xff0c 其各个数字的立方和等于该数本身 例如 xff0c 153是水仙花数 xff0c 因为153 61 1X1X1 43 5X5X5 43 3X3X3 思路 1 首
  • 【C语言】switch语句中的各case及default间顺序关系

    题目 xff1a switch语句中各个case和default出现先后次序不影响程序执行结果 本题目的答案有一定的争议性 xff0c 因为对于switch语句中 xff0c 各case和default的顺序是否对程序执行结果有影响还是取决
  • js实现节流和防抖

    代码实现 防抖 xff1a 就是指连续触发事件但是在设定的一段时间内中只执行最后后一次 xff0c 例如 xff1a 设定1000毫秒执行 xff0c 当你触发事件了 xff0c 他会1000毫秒后执行 xff0c 但是在还剩500毫秒的时
  • publisher与subscriber话题的消息类型md5sum不一致问题

    ERROR 1604235557 591296096 Client range vision fusion 01 wants topic detection vision objects to have datatype md5sum au
  • Ubuntu18.04下px4+MAVROSM+QGC地面站安装教程及避坑指南

    下面安装建立在已经安装好了ROS的基础 xff0c 未安装ROS的请先按照下面教程安装ROSROS 安装教程 目录 一 安装px4 toolchain 二 编译PX4固件 三 mavros and mavlink 安装 四 修改gazebo
  • Linux实用工具/软件

    一 录屏 Kazam 参考 xff1a Linux截图和屏幕视频录制软件Kazam 简书 二 播放器 VLC 推荐理由 xff1a 跨平台播放器 xff0c 支持H264等高清算法压缩格式 h264压缩比是200 1 xff0c 一般的第三
  • Ubuntu 安装boost

    boost是扩展的C 43 43 标准库 查看电脑默认安装的boost版本 xff1a dpkg S usr include boost version hpp 很多程序需要boost xff0c 但是版本可能不是ubuntu系统默认安装的
  • linux+python自动备份数据库

    linux 43 python自动备份数据库 1 在linux上安装mysqldump xff1a yum y install holland mysqldump noarch 2 编写python脚本 xff1a usr bin pyth
  • python基于Tkinter实现学生信息管理系统

    一 功能点介绍 xff08 毕设设计 xff09 1 添加学生成绩 xff1a 管理员可以在系统中添加学生的成绩信息 xff0c 包括学生姓名 学号 课程名称 成绩等 2 删除学生成绩 xff1a 管理员可以根据学生的学号或者姓名删除学生的
  • 感想京东

    xfeff xfeff 现在网上购物已经是家常便饭 xff0c 大多数人们都已接受了网购这种方式 xff0c 而能够给人们提供网购的网站也很多 xff0c 而我从好几年前就开始在京东网购物了 xff0c 因此京东商城的每一次发展 xff0c
  • 2014年度总结

    时光转眼即逝 xff0c 从还是懵懵懂懂的孩子一下子变成了已步入社会的工作者 回首2014年 xff0c 有欢乐 xff0c 有泪水 xff0c 有付出 xff0c 有收获等等 xff01 想起2014的自己还是一个刚步入工作岗位才半年 x
  • 将tensorflow训练好的模型移植到android

    将tensorflow训练好的模型移植到android上 说明 本文将描述如何将一个训练好的模型植入到android设备上 xff0c 并且在android设备上输入待处理数据 xff0c 通过模型 xff0c 获取输出数据 通过一个例子
  • FreeRTOS 启动第一个线程的步骤

    FreeRTOS 启动第一个线程的步骤 从main函数开始 初始化完成之后 通过SVC指令的中断函数来 初始化成需要的寄存器值 才能正常运行线程 1 启动第一个线程函数prvStartFirstTask 调用prvStartFirstTas
  • C#委托与事件的本质区别

    C 委托与事件的本质区别 从定义上说 xff0c 委托被编译器编译成一个类 xff0c 所以它可以像类一样在任何地方定义 xff0c 而事件被编译成一个委托类型的私有字段和两个公有add 和 remove 方法 xff08 有点类似于属性的