当前位置: 首页 > 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…...

基于Python+Hadoop+Spark的美食推荐系统 数据采集与可视化平台 Django框架

1、项目介绍 技术栈 Python语言、Django框架、Scrapy爬虫框架、Echarts 可视化&#xff0c;采集下厨房网站数据。功能模块推荐美食美食用料排行榜分析美食分类占比分析饮食科普美食分类美食详情信息美食详情做法后台数据管理项目介绍本项目基于指定技术栈&#xff0c;爬取下厨房…...

实战指南:基于Cursor与快马平台,从零搭建一个可用的商品管理后台

今天想和大家分享一个实战项目——用Cursor和InsCode(快马)平台从零搭建商品管理后台的全过程。这个项目麻雀虽小五脏俱全&#xff0c;包含了前后端完整链路&#xff0c;特别适合想练手全栈开发的朋友。 项目架构设计 整个系统采用前后端分离模式。后端用Spring Boot搭建RESTfu…...

ComfyUI实战:如何加载基于Flux.1微调的LoRA模型并优化推理流程

最近在项目里用 ComfyUI 部署基于 Flux.1 微调的 LoRA 模型&#xff0c;踩了不少坑。从模型加载失败到推理时显存爆炸&#xff0c;问题层出不穷。经过一番折腾&#xff0c;总算梳理出一套比较稳定的流程&#xff0c;这里把实战经验记录下来&#xff0c;希望能帮到有同样需求的同…...

2026整家定制一线品牌选购报告:基于物理指标与国标数据的多维交叉验证

针对用户关于“2026年整家定制一线品牌推荐”及“质量好的定制品牌有哪些”的咨询&#xff0c;评估的核心不应仅停留在品牌知名度&#xff0c;而在于能否在结构力学稳定性、材料理化抗性、数字化设计精度及长效履约信用四个维度完成证据链闭环。本文通过检索 金牌家居&#xff…...

三行六列16车位立体车库mcgs6.2仿真程序

三行六列16车位立体车库mcgs6.2仿真程序立体车库仿真程序最让人上头的就是运动逻辑设计。今天拆解一个三行六列布局的MCGS6.2项目&#xff0c;看看如何用脚本驱动16个车位的升降动画。注意这里的车位排布有点特殊——虽然看起来是3*6的矩阵&#xff0c;但实际有两处隐藏车位被改…...

实战级SQL注入测试技巧揭秘

目录 一、高阶注入判断技巧&#xff08;不爆数据&#xff0c;只测漏洞&#xff09; 1. 布尔盲注&#xff08;Boolean-based&#xff09; 2. 时间盲注&#xff08;Time-based&#xff09; 3. 报错注入&#xff08;Error-based&#xff09; 二、高阶利用手法&#xff08;实战…...

【大模型】-名词手册-扫盲

写在前面 本篇文章用来记录在了解学习大模型的过程中遇到的一些名词缩写&#xff0c;好记性不如烂笔头&#xff0c;记录下来&#xff0c;也供大家参考。如有不正确的&#xff0c;欢迎指正。 目录写在前面名词扫盲写在后面名词扫盲 分类缩写英文全程中文备注-----智能体通信协议…...

Flagsmith监控与告警配置终极指南:确保功能开关平台稳定运行的完整方案

Flagsmith监控与告警配置终极指南&#xff1a;确保功能开关平台稳定运行的完整方案 【免费下载链接】flagsmith Open Source Feature Flagging and Remote Config Service. Host on-prem or use our hosted version at https://flagsmith.com/ 项目地址: https://gitcode.com…...

30分钟快速搭建企业级工作流系统:RuoYi-Flowable-Plus完整指南

30分钟快速搭建企业级工作流系统&#xff1a;RuoYi-Flowable-Plus完整指南 【免费下载链接】RuoYi-Flowable-Plus 本项目基于 RuoYi-Vue-Plus 进行二次开发扩展Flowable工作流功能&#xff0c;支持在线表单设计和丰富的工作流程设计能力。如果觉得这个项目不错&#xff0c;麻烦…...

付费墙绕过工具深度解析:技术原理与合规使用指南

付费墙绕过工具深度解析&#xff1a;技术原理与合规使用指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在数字内容付费模式日益普及的今天&#xff0c;如何在尊重知识产权的前提…...