【進階】C# 委托(Delegate)知識點總結歸納

1. 委托的基本概念

  • 定義:委托是一種類型安全的函數指針,用于封裝方法(靜態方法或實例方法)。

  • 核心作用:允許將方法作為參數傳遞,實現回調機制和事件處理。

  • 類型安全:委托在編譯時會檢查方法簽名(參數類型和返回值類型)。

2. 委托的聲明與使用

  • 聲明語法:

delegate [返回類型] DelegateName([參數列表]);

?示例:

delegate void MyDelegate(string message); // 無返回值,接受一個字符串參數
  • 實例化與調用
// 實例化委托(綁定方法)
MyDelegate del = new MyDelegate(MyMethod);// 調用委托
del("Hello");static void MyMethod(string msg) {Console.WriteLine(msg);
}

3. 多播委托(Multicast Delegate)

  • 特點:一個委托實例可以綁定多個方法,通過?+=?和?-=?運算符管理方法鏈。

  • 調用順序:按添加順序依次執行所有方法。

  • 返回值:若委托有返回值,只有最后一個方法的返回值會被保留。

MyDelegate del1 = Method1;
MyDelegate del2 = Method2;
MyDelegate combined = del1 + del2; // 合并委托
combined("Multi-cast"); // 依次調用 Method1 和 Method2combined -= del1; // 移除委托

  • 4.?匿名方法與Lambda表達式?

  • 匿名方法(C# 2.0):無需顯式定義方法,直接通過?delegate?關鍵字綁定。
MyDelegate del = delegate(string msg) {Console.WriteLine("Anonymous: " + msg);
};
  • Lambda表達式(C# 3.0+):簡化匿名方法的語法。
MyDelegate del = (msg) => Console.WriteLine("Lambda: " + msg);

5. 內置泛型委托

  • Action:無返回值的委托,最多支持16個參數。
Action<string> action = (s) => Console.WriteLine(s);
  • Func:有返回值的委托,最后一個泛型參數為返回值類型,最多支持16個參數(不包括返回值類型)。
Func<int, int, int> add = (a, b) => a + b;
int result = add(3, 5); // 返回8
  • Predicate:返回?bool?的委托,常用于條件判斷,僅支持一個參數。
Predicate<int> isEven = num => num % 2 == 0;
bool result = isEven(4); // 返回true

6. 委托與事件

  • 事件本質:事件是基于委托的封裝,提供更安全的訂閱/取消訂閱機制。

  • 事件聲明

public event EventHandler MyEvent; // EventHandler 是內置委托
  • 觸發事件
MyEvent?.Invoke(this, EventArgs.Empty); // 安全調用
  • 事件與委托的區別:事件不能在類外部賦值和調用,只能在聲明它的類內部觸發(Invoke),外部只能訂閱(+=)或取消訂閱(-=)。

7. 協變與逆變(Covariance & Contravariance)

  • 協變(Covariance):允許委托返回類型是派生類(更具體類型)。(父類泛型委托裝子類泛型委托)
delegate Animal GetAnimalDelegate();
GetAnimalDelegate del = GetDog; // Dog 是 Animal 的子類
Animal animal = del();static Dog GetDog() => new Dog();
  • 逆變(Contravariance):允許委托參數是基類(更通用類型)。(子類泛型委托裝父類泛型委托)
delegate void ProcessDogDelegate(Dog dog);
ProcessDogDelegate del = ProcessAnimal; // 參數類型為Animal(基類)
del(new Dog());static void ProcessAnimal(Animal animal) { }

8. 注意事項

  • 內存泄漏:長期持有委托可能導致對象無法釋放,需及時取消訂閱(-=)。

  • 線程安全:多線程中委托調用需確保線程同步。

  • 默認值處理:調用空委托會引發異常,需判空:

del?.Invoke("Hello");

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79424.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79424.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79424.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WebRTC 服務器之Janus視頻會議插件信令交互

1.基礎知識回顧 WebRTC 服務器之Janus概述和環境搭建-CSDN博客 WebRTC 服務器之Janus架構分析-CSDN博客 2.插件使用流程 我們要使?janus的功能時&#xff0c;通常要執?以下操作&#xff1a; 1. 在你的??引入 Janus.js 庫&#xff0c;即是包含janus.js&#xff1b; <…

Go語言中的無鎖數據結構與并發效率優化

1. 引言 在高并發系統開發中&#xff0c;性能瓶頸往往出現在并發控制上。作為一個有著10年Go開發經驗的后端工程師&#xff0c;我見證了無數因鎖競爭導致的性能問題&#xff0c;也親歷了無鎖編程為系統帶來的巨大提升。 傳統的鎖機制就像是十字路口的紅綠燈——雖然能確保安全…

STM32部分:2、環境搭建

飛書文檔https://x509p6c8to.feishu.cn/wiki/DQsBw76bCiWaO4kS8TXcWDs0nAh Keil MDK用于編寫代碼&#xff0c;編譯代碼芯片支持包&#xff0c;用于支持某類芯片編程支持STM32CubeMX用于自動生成工程&#xff0c;減少手動重復工作 STM32F1系列芯片支持包 軟件下載 直接下載&am…

U3D工程師簡歷模板

模板信息 簡歷范文名稱&#xff1a;U3D工程師簡歷模板&#xff0c;所屬行業&#xff1a;其他 | 職位&#xff0c;模板編號&#xff1a;B29EPQ 專業的個人簡歷模板&#xff0c;邏輯清晰&#xff0c;排版簡潔美觀&#xff0c;讓你的個人簡歷顯得更專業&#xff0c;找到好工作。…

Java設計模式: 實戰案例解析

Java設計模式: 實戰案例解析 在軟件開發中&#xff0c;設計模式是一種用來解決特定問題的可復用解決方案。它們是經過實踐驗證的最佳實踐&#xff0c;能夠幫助開發人員設計出高質量、易于維護的代碼。本文將介紹一些常見的Java設計模式&#xff0c;并通過實戰案例解析它們在實際…

Vue3源碼學習5-不使用 `const enum` 的原因

文章目錄 前言? 什么是 const enum? 為什么 Vue 3 不使用 const enum1. &#x1f4e6; **影響構建工具兼容性**2. &#x1f501; **難以做模塊間 tree-shaking**3. &#x1f9ea; **調試困難**4. &#x1f4e6; **Vue 是庫&#xff0c;不掌控用戶配置** ? 官方推薦做法&…

C++學習:六個月從基礎到就業——C++11/14:lambda表達式

C學習&#xff1a;六個月從基礎到就業——C11/14&#xff1a;lambda表達式 本文是我C學習之旅系列的第四十篇技術文章&#xff0c;也是第三階段"現代C特性"的第二篇&#xff0c;主要介紹C11/14中引入的lambda表達式。查看完整系列目錄了解更多內容。 引言 Lambda表達…

AIDC智算中心建設:計算力核心技術解析

目錄 一、智算中心發展概覽 二、計算力核心技術解析 一、智算中心發展概覽 智算中心是人工智能發展的關鍵基礎設施&#xff0c;基于人工智能計算架構&#xff0c;提供人工智能應用所需算力服務、數據服務和算法服務的算力基礎設施&#xff0c;融合高性能計算設備、高速網絡以…

IoTDB時序數據庫V2.0.2大版本更新的一些梳理

一些小知識&#xff1a; 關于事務&#xff1a;時序數據庫是沒有事務的&#xff0c;它和關系數據庫的應用場景不同&#xff0c;通常情況下不需要多點同時操作同一條數據&#xff0c;而且要保證極高的吐出量&#xff0c;事務太消耗資源&#xff0c;并且時序數據庫提供了覆寫的功能…

CSS定位詳解

在前端開發中&#xff0c;CSS 定位&#xff08;positioning&#xff09;是一個核心概念&#xff0c;它決定了元素在頁面上的位置和布局方式。無論是構建復雜的交互界面&#xff0c;還是實現簡單的頁面排版&#xff0c;CSS 定位都是不可或缺的工具。本文將全面介紹 CSS 中的五種…

React 語法擴展

useReducer鉤子函數 不同action類型返回不同處理行為 useState()函數返回解構為兩個值 state當前狀態 dispatch修改狀態函數 dispatch()函數參數為一個actuon對象 如 &#xff1a; 樣例&#xff1a; import { useReducer } from react; import ./App.css;// 定義一個Reduce…

MCP協議與Dify集成教程

一、MCP協議概述 MCP&#xff08;Model Control Protocol&#xff09;是一種新興的開放協議&#xff0c;為大型語言模型&#xff08;LLM&#xff09;與外部應用之間構建了雙向通信通道。它就像是AI的"USB-C"接口&#xff0c;幫助模型發現、理解并安全調用各種外部工…

學習springboot-條件化配置@Conditional(條件注解)

前言 在Spring Boot中&#xff0c;Conditional 注解及其相關注解是用于條件化配置的重要工具。它們允許開發者根據特定條件決定是否加載某個Bean或配置類。 注意&#xff1a;Conditional 相關注解&#xff0c;通常和Bean搭配使用 學習springboot-Bean管理&#xff08;Bean 注…

2025年- H18-Lc126-54.螺旋矩陣(矩陣)---java版

1.題目描述 2.思路* 思路1&#xff1a; 補充2&#xff1a; directions[1][0] // 表示“下”這個方向的行增量&#xff08;1&#xff09; directions[1][1] // 表示“下”這個方向的列增量&#xff08;0&#xff09; int[][] directions {{0, 1}, {1, 0}, {0, -1}, {-…

微信小程序連續多個特殊字符自動換行解決方法

效果圖 .wxml <view class"container"><text>沒轉換{{text}}</text><view style"height: 60rpx;" /><text>轉換后{{convert}}</text> </view>.js Page({data: {text:&#xff01;&#xff01;&#xff01;&am…

編程速遞-RAD Studio 12.3 Athens四月補丁:關注軟件性能的開發者,安裝此補丁十分必要

2025年4月22日&#xff0c;Embarcadero發布了針對RAD Studio 12.3、Delphi 12.3以及CBuilder 12.3的四月補丁。此更新旨在提升這些產品的質量&#xff0c;特別關注于Delphi編譯器、C 64位現代工具鏈、RAD Studio 64位IDE及其調試器、VCL庫和其他RAD Studio特性。強烈建議所有使…

Linux 進程基礎(二):操作系統

目錄 一、什么是操作系統&#xff1a;用戶和電腦之間的「翻譯官」&#x1f310; OS 的層狀結構&#x1f9e9; 案例解析&#xff1a;雙擊鼠標的「跨層之旅」 二、操作系統的必要性探究&#xff1a;缺乏操作系統的環境面臨的挑戰剖析&#x1f511; OS 的「管理者」屬性&#xff1…

第 11 屆藍橋杯 C++ 青少組中 / 高級組省賽 2020 年真題,選擇題詳細解釋

一、選擇題 第 2 題 在二維數組按行優先存儲的情況下&#xff0c;元素 a[i][j] 前的元素個數計算如下&#xff1a; 1. **前面的完整行**&#xff1a;共有 i 行&#xff0c;每行 n 個元素&#xff0c;總計 i * n 個元素。 2. **當前行的前面元素**&#xff1a;在行內&#x…

1??7??three.js_OrbitControls相機控制器

17、相機軌道控制器 3D虛擬工廠在線體驗相機軌道控制器OrbitControls 它是 Three.js 中最常用的交互控制器之一,專門用于通過鼠標/觸摸控制相機圍繞一個目標點(target)旋轉、縮放和平移。import {OrbitControls } from three/addons/controls/OrbitControls.js; const cont…

以下是在 Ubuntu 上的幾款PDF 閱讀器,涵蓋輕量級、功能豐富和特色工具:

默認工具&#xff1a;Evince&#xff08;GNOME 文檔查看器&#xff09; 特點&#xff1a;Ubuntu 預裝&#xff0c;輕量快速&#xff0c;支持基本標注和書簽。 安裝&#xff1a;已預裝&#xff0c;或手動安裝&#xff1a; sudo apt install evince功能全面&#xff1a;Okular&…