深入理解C#委托操作:添加、移除与调用全解析

关键词:委托不可变性 · 多播委托 · 调用列表管理

⚙️ 一、委托的核心特性:不可变性

看似“添加”,实为新建

使用 += 为委托“添加”方法时(如 delVar += SCl.m3;):

  • 系统创建全新委托对象
  • 新委托的调用列表 = 原列表 + 新增方法
  • 原委托对象保持不变(内存地址不变)

✅ 本质:通过新建实现“修改”,符合委托不可变原则

内存变化图解

MyDel delVar = inst.MyM1;  // 初始委托 (指向方法1)
delVar += SCl.m3;          // 新建委托 (方法1+方法2)
delVar += X.Act;           // 再新建委托 (方法1+2+3)

🧩 二、安全移除方法的机制

-= 运算符的运作逻辑

delVar -= SCl.m3;  // 从调用列表移除方法
  • 创建新委托对象,复制除目标方法外的所有引用
  • 移除规则:
    • 从列表尾部向前搜索
    • 仅移除第一个匹配的方法实例
    • 试图移除不存在的方法时静默忽略

空委托防护

// 正确检查方式
if (delVar != null) 
{delVar(55); 
}
// 或使用空条件运算符 
delVar?.Invoke(65);

⚠️ 未检查空委托直接调用将抛出 NullReferenceException

📡 三、委托调用的双模式与陷阱

image

关键特性:

  • 参数传递:调用时传入的参数应用于所有方法
  • 重复执行:若同一方法在列表中出现多次,每次都会被调用
  • 输出参数:需特殊处理(避免值覆盖问题)

💻 四、完整实例解析

delegate void PrintFunction();  // 无返回值委托 class Test
{public void Print1() => Console.WriteLine("Print1 -- instance");public static void Print2() => Console.WriteLine("Print2 -- static");
}class Program
{static void Main(){var t = new Test();PrintFunction pf = t.Print1;  // 初始化// 添加三个方法(实际新建两次委托)pf += Test.Print2;  pf += t.Print1;     pf += Test.Print2;pf?.Invoke();  // 安全调用 }
}

输出结果:

Print1 – instance
Print2 – static
Print1 – instance
Print2 – static

🔑 关键点总结

  • 不可变性是核心:所有“修改”操作实质是创建新委托对象
  • 移除顺序敏感:从列表尾部开始匹配移除首个目标方法
  • 空委托防护:必须使用 if (delVar != null) 或 ?. 运算符
  • 调用成本:每次调用遍历整个调用列表,需注意性能影响

掌握委托的不可变本质,能有效避免异步编程中的常见陷阱。建议在事件处理等场景中始终遵循「添加后必移除」原则,防止内存泄漏问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86655.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud:微服务架构的基石与实践指南

一、Spring Cloud 核心组件 (一)Spring Cloud Netflix Spring Cloud Netflix 是 Spring Cloud 的核心模块之一,它集成了 Netflix 的多个开源组件,提供了微服务架构中常见的功能,如服务注册与发现、配置中心、API 网关…

【VPX3U】国产嵌入式平台:RK3588J×JH930硬件架构与红外应用方案

随着对边缘计算与多媒体处理需求的提升,国产异构平台成为关键发展方向。最近有一个项目需求,提出了一款基于瑞芯微 RK3588J 处理器与景嘉微GPU 的 VPX3U 规格嵌入式主板的设计想法旨在融合高性能异构计算与丰富的视频、网络和存储接口,适用于…

秩序密码-用群论分析魔方的阶

三阶魔方的物理基础是由一个三维十字轴连接的 6 个中心块,这 6 个中心块决定了魔方的 6 种颜色朝向,构成不动的坐标系统,此外还有两类活动块,分别是8个角块,12个棱块。 魔方的每一层转动(如 R: 右层顺时针…

Python驱动自动驾驶的“多眼”——打造高效传感器融合框架的实战思考

Python驱动自动驾驶的“多眼”——打造高效传感器融合框架的实战思考 最近,自动驾驶行业火得不行,背后支撑它的技术,远不止车载摄像头那么简单。真正让车“看懂”世界的,是多种传感器数据的“融合”,包括雷达、激光雷达(LiDAR)、摄像头、惯性测量单元(IMU)等等。 而如…

机器学习-- 聚类

什么是聚类? Clustering 可以简单地说,对有标注的数据分类,就是逻辑回归(属于有监督分类),对无标注的数据分类,就是聚类(属于无监督分类) 聚类是一种无监督学习技术&am…

【Yonghong 企业日常问题08 】永洪BI的Apache Tomcat版本升级指南

文章目录 前言操作步骤登录验证 前言 某公司业务永洪BI系统使用tomcat 9.0.97版本,接到总公司漏洞扫描整改要求需要将tomcat版本升级到9.0.97以上。 目标:tomcat 9.0.97》 9.0.98 1、下载tomcat所需要的版本 地址:https://tomcat.apache.org/download-…

BigFoot RaidSlackCheck11.109.zip lua

BigFoot RaidSlackCheck11.109.zip lua 合剂buff检查插件 把lua脚本拷贝到游戏插件目录下: D:\Battle.net\World of Warcraft\_classic_\Interface\AddOns 命令 /rsc 下载地址: https://download.csdn.net/download/spencer_tseng/91181827

深入解析前端 Meta 标签:HTML 的隐形守护者与功能大师

在构建现代网页时&#xff0c;我们常常关注炫目的视觉效果、复杂的交互逻辑或强大的框架&#xff0c;却容易忽略那些深藏于 <head> 之中、看似不起眼的 <meta> 标签。这些标签如同网页的隐形守护者&#xff0c;无声地承担着定义文档元数据、指导浏览器行为、优化搜…

青少年编程与数学 01-012 通用应用软件简介 11 应用商店

青少年编程与数学 01-012 通用应用软件简介 11 应用商店 一、什么是应用商店&#xff08;一&#xff09;应用商店的基本定义&#xff08;二&#xff09;应用商店的工作原理&#xff08;三&#xff09;应用商店的类型 二、应用商店的重要意义&#xff08;一&#xff09;为用户提…

《红黑树实现》

引言&#xff1a; 上次我们学习了比二叉搜索树更高效的平衡二叉搜索树&#xff08;AVL树&#xff09;&#xff0c;这次我们要学习的是另外一种对二叉搜索树的优化后的红黑树。 一&#xff1a;红黑树概念&#xff1a; 红黑树是一棵二叉搜索树&#xff0c;他的每个结点增加一个…

领域驱动设计(DDD)【23】之泛化:从概念到实践

文章目录 一 泛化基础&#xff1a;理解DDD中的核心抽象机制1.1 什么是泛化&#xff1f;1.2 为什么泛化在DDD中重要&#xff1f;1.3 泛化与特化的双向关系 二 DDD中泛化的实现形式2.0 实现形式概览2.1 类继承&#xff1a;最直接的泛化实现2.2 接口实现&#xff1a;更灵活的泛化方…

机箱流动空气热学仿真方案

机箱流动空气热学仿真方案(二维平面与三维) 一、物理模型与数学模型 1. 控制方程 流动与传热基本方程: 连续性方程:∇(ρu) = 0动量方程(Navier-Stokes):ρ(u∇)u = -∇p + μ∇u + F能量方程:ρcₚ(u∇)T = k∇T + Φ边界条件: 入口:速度入口(u=u₀, T=T₀)出口:压…

electron 如何配置 打开控制台

在 Electron 应用中&#xff0c;打开开发者工具&#xff08;即控制台&#xff09;通常有两种方式&#xff1a; 程序运行时手动打开 在 Electron 应用中&#xff0c;你可以通过编程方式打开开发者工具。这通常在你需要调试时非常有用。你可以在你的主进程&#xff08;通常是 ma…

MR7350用TTL刷机救砖过程

很久之前就买了一台Linksys的MR7350路由器&#xff0c;准备有OpenWRT的官方固件之后再拿它当轻NAS用&#xff0c;最近看到出了Snapshot版&#xff0c;于是就拿来刷机试试。经过我坚持不懈的折腾&#xff0c;终于把我的MR7350路由器刷成了砖&#xff0c;即便是通过开机过程中断电…

在NPU单算子(torch_npu )执行时如何进行性能优化?以MinerU为例

1 MinerU介绍 在AI技术快速发展的今天&#xff0c;大量非结构化数据的处理成为亟待解决的问题。尤其是PDF文档&#xff0c;作为最常见的文件格式之一&#xff0c;如何高效准确地提取其中的信息&#xff0c;成为了许多企业和研究机构的痛点。上海人工智能实验室&#xff08;上海…

鸿蒙OS开发IoT控制应用:从入门到实践

引言&#xff1a;万物互联时代的应用开发新范式 在物联网(IoT)技术迅猛发展的今天&#xff0c;智能设备数量呈指数级增长。据IDC预测&#xff0c;到2025年全球IoT连接设备数将达到416亿台。面对碎片化的IoT设备和多样化的控制需求&#xff0c;华为鸿蒙OS(HarmonyOS)应运而生&a…

五层网络模型:网络通信的核心框架

在网络通信的世界里&#xff0c;五层网络模型是一个基础而关键的概念。它帮助我们理解数据是如何在网络上从一个设备传输到另一个设备的。本文将详细介绍五层网络模型的每一层&#xff0c;以及它们在数据传输过程中的作用。 一、五层网络模型概述 五层网络模型是一种分层的网…

常见的强化学习算法分类及其特点

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种机器学习方法&#xff0c;通过智能体&#xff08;Agent&#xff09;与环境&#xff08;Environment&#xff09;的交互来学习如何采取行动以最大化累积奖励。以下是一些常见的强化学习算法分类及其特点&#…

【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法三)不定长滑动窗口+数组

Problem: 438. 找到字符串中所有字母异位词 题目&#xff1a;给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 【LeetCode 热题 100】438. 找到字符串中所有字母异位词——&#xff08;解法一&…

求区间最大值

题目描述 给定一个长度为 N 的数列&#xff0c;和 M 次询问&#xff0c;求出每一次询问的区间内数字的最大值。 输入描述 第一行包含两个整数 N,M&#xff0c;分别表示数列的长度和询问的个数。 第二行包含 N 个整数&#xff08;记为&#x1d44e;&#x1d456;&#xff09;&am…