深入理解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
英文地址,請注明出處:http://en.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…