当前位置: 首页 > news >正文

C# 委托/事件/lambda

概念 

委托

  1. 定义委托编译器会自动生成一个类派生自System.MulticastDelegate

这个类包含4个方法:一个构造器、Invoke、BeginInvoke、EndInvoke。

  1. 调用委托的时候实际上执行的是 Invoke方法。

MulticastDelegate有三个重要字段:

  1. _targetSystem.Object):当委托对象包装的是一个静态方法,这个字段为null。当委托对象包装一个实例方法,这个字段引用的是回调方法要操作的对象
  2. _methodPtrSystem.IntPtr):这是一个 System.IntPtr 类型的字段,它存储了方法的内存地址。这个内存地址是 CLR 用来标识委托所引用方法的唯一标识。
  3. _invocationListSystem.Object):该字段通常为null,构造委托链时它引用一个委托数组。若不为null,Invoke的时候会遍历委托数组依次调用。可以使用GetInvocationList接口获取这个数组。

用委托回调多个方法(委托链)

使用Delegate.Combine 或者用 += 可以将多个委托合并成委托链。每次添加时 _invocationList都会新建一个新的委托数组,数组里存放所有委托,之前引用的数组等待被GC回收。

使用Delegate.Remove 或者 -= 可以从委托链中删除一个委托,通过 _target和_methodPtr找到匹配的委托后,_invocationList同样会引用一个新建数组,新数组不包含移除的那个委托。

若委托链中只剩一个委托,删除成功后返回null。

C#自带的委托

1)Action:无返回值委托,最多支持16个泛型参数。

2)Func:返回一个泛型,最多支持16个泛型参数,最后一个参数必须是返回值类型。

Unity自带的委托

1)UnityAction:无返回值,最多支持4个泛型参数。

2)UnityEvent:Unity对UnityAction的封装。

泛型委托的协变/逆变参数类型

使用 in 关键字表示逆变,参数可以使用类型的派生类。

使用 out 关键字表示协变,参数可以使用类型的基类。

事件

事件是委托的包装器,内部维护了一个私有的委托链。向事件注册监听的时候其实就是往委托链里面添加一个委托,当事件触发的时候,会遍历委托链依次调用。


示例 

在某个管理器中给出一个获取Sprite的方法 ,因为addressables异步加载资源,所以 获取的信息必须在资源回调中返回,那么直接使用lambda表达式便于回调的赋值

 public void GetCustomerSprite(int id, Action<Sprite> callback){AddressablesMgr.GetInstance().LoadAssetAsync<Sprite>(customerDataDic[id].bigImgRes, (obj) =>{callback(obj.Result);});}

外部调用代码

        InventoryData.GetInstance().GetCustomerSprite(id, (sprite) =>{bigImg.sprite = sprite;});

相关文章:

C# 委托/事件/lambda

概念 委托 定义委托编译器会自动生成一个类派生自System.MulticastDelegate 这个类包含4个方法&#xff1a;一个构造器、Invoke、BeginInvoke、EndInvoke。 调用委托的时候实际上执行的是 Invoke方法。 MulticastDelegate类有三个重要字段&#xff1a; _target&#xff…...

13款趣味性不错(炫酷)的前端动画特效及源码(预览获取)分享(附源码)

文字激光打印特效 基于canvas实现的动画特效&#xff0c;你既可以设置初始的打印文字也可以在下方输入文字可实现激光字体打印&#xff0c;精简易用。 预览获取 核心代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…...

C# 友元程序集

1.友元程序集 使用友元程序集可以将internal成员提供给其他的友元程序集访问。 程序集FriendTest1.dll [assembly:InternalsVisibleTo("FriendTest2")] namespace FriendTest1 {internal class Friend{string name;public string Name > name;public Friend(str…...

CRM系统的数据分析和报表功能对企业重要吗?

竞争日益激烈&#xff0c;企业需要更加高效地管理客户关系&#xff0c;以获取更多的商机。为此&#xff0c;许多企业选择使用CRM系统。在CRM中&#xff0c;数据分析功能扮演着重要的角色。下面就来详细说说&#xff0c;CRM系统数据分析与报表功能对企业来说重要吗&#xff1f; …...

【单体架构事务失效解决方式之___代理对象加锁】

单体架构__用户限买 一个id一单的多线程事务失效问题解决 背景介绍&#xff1a;有一种情况&#xff0c;我们在使用Synchronized的时候出现失效情况。 经过排查&#xff0c;是因为使用了this.当前对象&#xff0c;他现在使用的是目标对象加锁失效&#xff0c;使用代理对象加锁就…...

面试被问到 HTTP和HTTPS的区别有哪些?你该如何回答~

HTTP和HTTPS的区别有哪些&#xff0c;主要从以下几个方面来说&#xff1a; 1.安全性 HTTP和HTTPS是两种不同的协议&#xff0c;它们之间最主要的区别在于安全性。HTTP协议以明文方式发送内容&#xff0c;不提供任何方式的数据加密&#xff0c;容易被攻击者截取信息。 HTTPS则在…...

点评项目——短信登陆模块

2023.12.6 短信登陆如果基于session来实现&#xff0c;会存在session共享问题&#xff1a;多台Tomcat不能共享session存储空间&#xff0c;这会导致当请求切换到不同服务器时出现数据丢失的问题。 早期的解决办法是让session提供一个数据拷贝的功能&#xff0c;即让各个Tomcat的…...

2023亚太地区五岳杯量子计算挑战赛

计算电源网 (CPN&#xff09;布局优化 1. 介绍 计算能力网络 &#xff08;CPN&#xff09;是一种基于业务需求分配和调度计算资源的新型信息基础设施&#xff0c;计算资源通常由终端用户、边缘服务器和云服务器组成。该网络旨在满足各种计算任务的需求。根据计算需求的空间分…...

Python 模块的使用方法

Python 模块是一种组织和封装代码的方式&#xff0c;允许你将相关的功能和变量放在一个单独的文件中&#xff0c;以便在其他程序中重复使用。在Python中&#xff0c;模块是一种可执行的Python脚本&#xff0c;其文件扩展名为 .py。这里&#xff0c;我将详细讲解Python模块的使用…...

【知识】稀疏矩阵是否比密集矩阵更高效?

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 问题提出 有些地方说&#xff0c;稀疏图比密集图的计算效率更高&#xff0c;真的吗&#xff1f; 原因猜想 这里的效率高&#xff0c;应该是有前提的&#xff1a;当使用稀疏矩阵的存储格式(如CSR)时&#xff0c;计…...

代码随想Day24 | 回溯法模板、77. 组合

理论基础 回溯法和递归不可分割&#xff0c;回溯法是一种穷举的方法&#xff0c;通常需要剪枝来降低复杂度。回溯法有一个选择并退回的过程&#xff0c;可以抽象为树结构&#xff0c;回溯法的模板如下&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}…...

搜索与回溯算法②

求0-9的数字可以组成的所有k 位数。 def backtrack(start, path, k, n, results):"""核心函数。:param start: 下一个添加的数字的起始位置:param path: 当前构建的路径&#xff0c;代表一个组合:param k: 组合中所需的数字个数:param n: 可选数字的最大值:par…...

Centos图形化界面封装OpenStack Ubuntu镜像

目录 背景 环境 搭建kvm环境 安装ubuntu虚机 虚机设置 系统安装 登录虚机 安装cloud-init 安装cloud-utils-growpart 关闭实例 删除细节信息 删除网卡细节 使虚机脱离libvirt纳管 结束与验证 压缩与转移 验证是否能够正常运行 背景 一般的镜像文件在上传OpenSt…...

使用Jmeter进行http接口测试怎么做?

前言&#xff1a; 本文主要针对http接口进行测试&#xff0c;使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的&#xff0c;它在实现对各种接口的调用方面已经做的比较成熟&#xff0c;因此&#xff0c;本次直接使用Jmeter工具来完成对Http接口的测试。 一、开发接…...

创建腾讯云存储桶---上传图片--使用cos-sdk完成上传

创建腾讯云存储桶—上传图片 注册腾讯云账号https://cloud.tencent.com/login 登录成功&#xff0c;选择右边的控制台 点击云产品&#xff0c;选择对象存储 创建存储桶 填写名称&#xff0c;选择公有读&#xff0c;私有写一直下一步&#xff0c;到创建 选择安全管理&#…...

12.3_黑马MybatisPlus笔记(上)

目录 02 03 04 05 06 07 ​编辑 thinking:system.out::println?​编辑 thinking&#xff1a;list.of? 08 thinking&#xff1a;RequestParam和 ApiParam注解使用&#xff1f; thinking&#xff1a;RequestParam 和PathVariable的区别&#xff1f; ​编辑 ​编…...

智能优化算法应用:基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.寄生捕食算法4.实验参数设定5.算法结果6.参考…...

全息图着色器插件:Hologram Shaders Pro for URP, HDRP Built-in

8个新的Unity全息图着色器,具有故障效果,扫描线,网格线,和更多其他效果!与所有渲染管线兼容。 软件包添加了一系列的全息图着色器到Unity。从基本的全息图与菲涅耳亮点,先进的全息图与两种故障效应,扫描线,文体点阵和网格线全息图! 特色全息效果 Basic-支持菲涅耳发光照…...

Python Opencv实践 - 简单的AR项目

这个简单的AR项目效果是&#xff0c;通过给定一张静态图片作为要视频中要替换的目标物品&#xff0c;当在视频中检测到图片中的物体时&#xff0c;通过单应矩阵做投影&#xff0c;将视频中的物体替换成一段视频播放。这个项目的所有素材来自自己的手机拍的视频。 静态图片&…...

Java不可变集合

Java不可变集合 不可变集合&#xff1a;也就是不可以被修改的集合 创建不可变集合的应用场景 ●如果某个数据不能被修改&#xff0c;把它防御性地拷贝到不可变集合中是个很好的实践。 ●当集合对象被不可信的库调用时&#xff0c;不可变形式是安全的。 简单理解&#xff1…...

机器人导航中的深度估计与SLAM技术实践

1. 机器人导航中的深度估计技术解析深度估计作为计算机视觉领域的核心技术&#xff0c;在机器人自主导航中扮演着关键角色。简单来说&#xff0c;它就像给机器人安装了一双能感知距离的"眼睛"——通过分析摄像头捕获的二维图像&#xff0c;计算出场景中每个像素点与相…...

收藏!小白也能入局:2026年高薪AI大模型应用开发工程师详解

2026年AI行业重心转向大模型应用开发&#xff0c;AI岗位数量激增&#xff0c;成为企业刚需。AI大模型应用开发工程师通过二次开发&#xff0c;将现成大模型转化为实用产品&#xff0c;如智能客服、知识库问答等。该岗位薪资高、需求旺&#xff0c;技能门槛相对较低&#xff0c;…...

5分钟掌握HunterPie:提升《怪物猎人:世界》狩猎效率的完整游戏辅助工具指南

5分钟掌握HunterPie&#xff1a;提升《怪物猎人&#xff1a;世界》狩猎效率的完整游戏辅助工具指南 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode…...

ARM TechCon实时聊天:解码CEO战略,洞察物联网与数据中心技术趋势

1. 活动背景与核心价值解析如果你在2013年10月底那个时间点&#xff0c;正盯着半导体和嵌入式系统的新闻动态&#xff0c;那你大概率不会错过一条消息&#xff1a;EE Times&#xff08;电子工程专辑&#xff09;邀请读者在ARM TechCon大会期间&#xff0c;加入一场关于ARM CEO …...

终极指南:3分钟掌握Translumo实时屏幕翻译工具,游戏外语学习两不误

终极指南&#xff1a;3分钟掌握Translumo实时屏幕翻译工具&#xff0c;游戏外语学习两不误 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr…...

Seraphine:三步打造你的英雄联盟智能BP助手

Seraphine&#xff1a;三步打造你的英雄联盟智能BP助手 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine Seraphine是一款基于英雄联盟官方LCU API开发的智能辅助工具&#xff0c;通过自动化BP流程和实时数据查…...

模拟芯片巨头Maxim 2010技术日深度解读:从工艺到应用的创新启示

1. 一场迟到的“技术盛宴”&#xff1a;深入解读Maxim 2010年编辑分析师日 在半导体行业&#xff0c;尤其是模拟芯片这个领域&#xff0c;巨头们的一举一动都牵动着整个产业链的神经。2010年9月底&#xff0c;模拟与混合信号半导体领域的“安静巨人”——Maxim Integrated&…...

全球供应链重塑下的半导体与PC板行业:工程师的挑战与韧性构建

1. 从“分裂的联盟”到工程师的十字路口 最近翻看行业旧闻&#xff0c;读到一篇2019年EE Times上Rick Merritt的评论文章&#xff0c;标题叫“State of the Disunion”。文章本身探讨的是当时科技行业在政治与全球化张力下的处境&#xff0c;但最让我印象深刻的&#xff0c;是评…...

房地产行业 Zoom 钓鱼攻击机理与防御体系研究

摘要 2026 年 5 月&#xff0c;美国加利福尼亚房地产协会&#xff08;C.A.R.&#xff09;发布预警&#xff0c;针对房产中介的新型 Zoom 钓鱼诈骗呈高发态势。攻击者依托房产门户网站房源信息&#xff0c;伪装成意向购房者发起虚假咨询&#xff0c;以沟通房源细节为由诱导中介点…...

QUdpSocket 性能调优与零丢包实践

1. QUdpSocket性能瓶颈深度解析 第一次用QUdpSocket接收传感器数据时&#xff0c;我盯着监控屏幕上跳动的丢包统计数字&#xff0c;后背直冒冷汗——每秒2000个数据包竟然丢了近三成&#xff01;这种经历恐怕很多做过工业物联网开发的同行都遇到过。QUdpSocket作为Qt框架中的U…...