C#中,什么是委托,什么是事件及它們之間的關系

1. 委托(Delegate)

定義與作用
  • ?委托?是類型安全的函數指針,用于封裝方法,支持多播(鏈式調用)。
  • ?核心能力?:將方法作為參數傳遞或異步回調。
使用場景
  1. 回調機制(如異步操作完成通知)。
  2. 實現策略模式(動態替換算法邏輯)。
  3. LINQ查詢中的條件篩選(Where(x => x > 6))。
  4. 多播委托(多個方法依次執行)。
示例代碼
// 定義委托 
public delegate void LogHandler(string message); 
/ 使用委托public class Processor 
{ public void RunTask(LogHandler logger) 
{ logger("Task started.");
// ...業務邏輯 logger("Task completed."); 
} 
} // 調用方 
var processor = new Processor(); 
processor.RunTask(message => Console.WriteLine($"[LOG] {message}")); 

2. 事件(Event)

定義與作用
  • ?事件?是基于委托的語法糖,強制封裝性,遵循?發布-訂閱模式?。
  • ?核心規則?:只能在聲明類內部觸發(Invoke),外部僅能+=-=訂閱。
使用場景
  1. GUI事件(按鈕點擊、鼠標移動)。
  2. 觀察者模式(狀態變化通知)。
  3. 松耦合系統(組件間通信)。
示例代碼
// 定義事件public class OrderService 
{ 
public event EventHandler<OrderEventArgs> OrderSubmitted; 
public void SubmitOrder(Order order) 
{ 
// ...提交訂單邏輯 
OnOrderSubmitted(new OrderEventArgs(order));} 
protected virtual void OnOrderSubmitted(OrderEventArgs e) 
{ OrderSubmitted?.Invoke(this, e); } } 
// 訂閱事件 var service = new OrderService();service.OrderSubmitted += (sender, e) => { 
Console.WriteLine($"Order {e.OrderId} submitted!");}; 

3. 委托與事件的關系

?特性??委托??事件?
封裝性可被外部直接調用只能在聲明類內觸發
多播支持支持
安全性低(外部可修改委托鏈)高(外部僅訂閱/取消)
典型用途靈活的方法傳遞系統級通知(如UI交互)

關鍵點總結

  1. ?委托是基礎?:事件本質是受限的委托,編譯器自動生成add/remove方法。
  2. ?設計原則?:
    • 事件用于?被動通知?(如用戶操作)。
    • 委托用于?主動傳遞邏輯?(如回調函數)。
  3. ?代碼規范?:事件命名使用動詞(如Clicked/DataReceived),委托命名用Handler后綴。

疑問與解決方案

?Q1:為什么事件比委托更安全??
A1:事件禁止外部直接賦值(=操作符),強制通過+=-=管理訂閱,避免覆蓋其他訂閱者。

?Q2:何時選擇自定義委托而非Action/Func?
A2:需要明確語義時

(如public delegate void PriceChangedHandler(double oldPrice)優于Action<double>)。

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

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

相關文章

從替代到超越,禪道國產化替代解決方案2.0發布!

3月22日&#xff0c;由禪道攜手上海惠艾信息科技、麥哲思科技共同舉辦的禪道?中國行北京站活動圓滿落下帷幕。 除深入探究AI賦能研發項目管理外&#xff0c;禪道在活動現場正式發布了《禪道國產化替代解決方案2.0》&#xff0c;助力企業全方位構建自主可控的研發項目管理新體…

【VirtualBox 安裝 Ubuntu 22.04】

網上教程良莠不齊&#xff0c;有一個CSDN的教程雖然很全面&#xff0c;但是截圖冗余&#xff0c;看蒙了給我&#xff0c;這里記錄一個整潔的教程鏈接。以備后患。 下載安裝全流程 UP還在記錄生活&#xff0c;看的我好羨慕&#xff0c;嗚嗚。 [VirtualBox網絡配置超全詳解]&am…

2025美國網絡專線國內服務商推薦

在海外業務競爭加劇的背景下&#xff0c;穩定高效的美國網絡專線已成為外貿企業、跨國電商及跨國企業的剛需。面對復雜的國際網絡環境和嚴苛的業務要求&#xff0c;國內服務商Ogcloud憑借其創新的SD-WAN技術架構與全球化網絡布局&#xff0c;正成為企業拓展北美市場的優選合作伙…

2.2.2 引入配置文件和定義配置類

本實戰通過三種方式實現Spring Boot中的配置加載與管理。首先&#xff0c;通過PropertySource加載自定義配置文件&#xff0c;結合ConfigurationProperties注解將配置文件中的屬性綁定到Java類中&#xff0c;實現配置的靈活管理。其次&#xff0c;利用ImportResource加載XML配置…

Django:構建高性能Web應用

引言&#xff1a;為何選擇Django&#xff1f; 在當今快速發展的互聯網時代&#xff0c;Web應用的開發效率與可維護性成為開發者關注的核心。Django作為一款基于Python的高級Web框架&#xff0c;以其"開箱即用"的特性、強大的ORM系統、優雅的URL路由設計&#xff0c;…

【銀河麒麟高級服務器操作系統 】虛擬機運行數據庫存儲異常現象分析及處理全流程

更多銀河麒麟操作系統產品及技術討論&#xff0c;歡迎加入銀河麒麟操作系統官方論壇 https://forum.kylinos.cn 了解更多銀河麒麟操作系統全新產品&#xff0c;請點擊訪問 麒麟軟件產品專區&#xff1a;https://product.kylinos.cn 開發者專區&#xff1a;https://developer…

《2核2G阿里云神操作!Ubuntu+Ollama低成本部署Deepseek模型實戰》

簡介&#xff1a; “本文為AI開發者揭秘如何在阿里云2核2G輕量級ECS服務器上&#xff0c;通過Ubuntu系統與Ollama框架實現Deepseek模型的高效部署。無需昂貴硬件&#xff0c;手把手教程涵蓋環境配置、資源優化及避坑指南&#xff0c;助力初學者用極低成本在云端跑通行業領先的大…

【bug解決】NameError: name ‘fused_act_ext‘ is not defined

問題 使用basicsr庫做超分的時候發現NameError: name fused_act_ext is not defined這個問題&#xff0c;一直不斷重復的使用pip uninstall basicsr 和 BASICSR_EXTTrue pip install basicsr 發現一直沒有執行編譯過程&#xff0c;導致一直推理失敗 原因 之前已經安裝過basi…

Anaconda開始菜單里添加JupyterLab快捷方式

Anaconda開始菜單里添加JupyterLab快捷方式 在 Windows 系統安裝 Anaconda 后&#xff0c;發現開始菜單只有 Jupyter Notebook&#xff0c;卻找不到Jupyter Lab入口。其實這是因為最新版 Anaconda 默認未預裝 Lab 組件&#xff0c;本篇介紹一種添加 Jupyter Lab入口到開始菜單…

【Qt】modbus客戶端筆記

Qt 中基于 Modbus 協議的通用客戶端學習筆記 一、概述 本客戶端利用 Qt 的 QModbusTcpClient 實現與 Modbus 服務器的通信&#xff0c;具備連接、讀寫寄存器、心跳檢測、自動重連等功能&#xff0c;旨在提供一個可靠且易用的 Modbus 客戶端框架&#xff0c;方便在不同項目中集…

解決Vmware 運行虛擬機Ubuntu22.04卡頓、終端打字延遲問題

親測可用 打開虛擬機設置&#xff0c;關閉加速3D圖形 &#xff08;應該是顯卡驅動的問題&#xff0c;不知道那個版本的驅動不會出現這個問題&#xff0c;所以干脆把加速關了&#xff09;

【網絡】Socket套接字

目錄 一、端口號 二、初識TCP/UDP協議 三、網絡字節序 3.1 概念 3.2 常用API 四、Socket套接字 4.1 概念 4.2 常用API &#xff08;1&#xff09;socket &#xff08;2&#xff09;bind sockaddr結構 &#xff08;3&#xff09;listen &#xff08;4&#xff09;a…

內聯函數/函數重載/函數參數缺省

一、內聯函數 為了減少函數調用的開銷 在函數定義前加“inline”關鍵字&#xff0c;即可定義內聯函數 二、函數重載 1.名字相同 2.參數個數或者參數類型不同 編譯器根據調用語句實參的個數和類型判斷應該調用哪個函數 三、函數的缺省參數 定義函數的時候可以讓最右邊的連…

基于神經網絡的文本分類的設計與實現

標題:基于神經網絡的文本分類的設計與實現 內容:1.摘要 在信息爆炸的時代&#xff0c;大量文本數據的分類處理變得至關重要。本文旨在設計并實現一種基于神經網絡的文本分類系統。通過構建合適的神經網絡模型&#xff0c;采用公開的文本數據集進行訓練和測試。在實驗中&#x…

Baklib內容中臺的核心定位是什么?

構建企業級知識中樞 在數字化轉型趨勢下&#xff0c;Baklib內容中臺通過構建企業級知識中樞&#xff0c;實現了從碎片化信息到體系化資產的躍遷。其核心能力體現為對多源內容的智能聚合與結構化存儲&#xff0c;支持從文檔、圖片到視頻的全格式整合&#xff0c;并通過語義標簽…

藍耘平臺API深度剖析:如何高效實現AI應用聯動

目錄 一、藍耘平臺簡介 1.1 藍耘通義大模型 1.2 藍耘云計算資源 1.3 藍耘API與微服務 二、 藍耘平臺應用聯動場景 2.1 數據采集與預處理聯動 2.2 模型推理與后端服務聯動 2.3 跨平臺聯動 三、藍耘平臺注冊體驗功能 3.1 注冊 3.2 體驗藍耘MaaS平臺如何使用海螺AI生成視頻…

《大語言模型賦能證券業開發安全:海云安技術方案在上交所專刊發表》

近日&#xff0c;海云安《大語言模型在證券業開發安全領域的探索與實踐》技術方案經過上海證券交易所&#xff08;以下簡稱”上交所“&#xff09;行業專家評審后正式收錄于《交易技術前沿——網絡安全專刊&#xff08;2025年第1期 總第61期&#xff09;》。 證券信息技術研究…

第三課:Stable Diffusion圖生圖入門及應用

文章目錄 Part01 圖生圖原理Part02 圖生圖基本流程Part03 隨機種子作用解析Part04 圖生圖的拓展應用 Part01 圖生圖原理 當提示詞不能足夠表達用戶需求的時候&#xff0c;加入圖片能讓AI更好的理解你的想法圖片上的像素信息會在加噪和去噪的過程中&#xff0c;作為一種特征反映…

將網絡安全和第三方風險管理與業務目標相結合

在網絡安全風險領域&#xff0c;我們經常遇到與企業語言不通的問題。這可能導致網絡安全風險管理計劃得不到支持。當發現網絡安全風險時&#xff0c;困難在于以符合組織語言和目標的方式來表達它。 第三方風險屬于另一個灰色地帶。在組織內部&#xff0c;許多利益相關者&#…

使用Github項目nghttp3的樣例學習HTTP/3

文章目錄 前言一、HTTP3測試 in Ubuntu1.1. 基本軟件1.2. gcc/g1.2.1. Ubuntu221.2.2. Ubuntu201.2.2.1. 必備庫1.2.2.1.1. gmp1.2.2.1.2. mpfr1.2.2.1.3. mpc 1.2.2.2. 安裝 1.3. libev > 4.11&#xff08;備用&#xff09;1.3.1. 安裝1.3.2. 測試 1.4. nghttp31.5. ngtcp2…