C# 委托(調用帶引用參數的委托)

調用帶引用參數的委托

如果委托有引用參數,參數值會根據調用列表中的一個或多個方法的返回值而改變。
在調用委托列表中的下一個方法時,參數的新值(不是初始值)會傳給下一個方法。例如,
如下代碼調用了具有引用參數的委托。圖14-11演示了這段代碼。

delegate void MyDel(ref int X);class MyClass
{public void Add2(ref int x){x+=2;}public void Add3(ref int x){x+=3;}static void Main(){MyClass mc=new MyClass();MyDel mDel=mc.Add2;mDel+=mc.Add3;mDel+=mc.Add2;int x=5;mDel(ref x);Console.WriteLine($"Value:{x}")}
}

引用參數的值會在調用間發生改變

匿名方法

至此,我們已經介紹了使用靜態方法或實例方法來實例化委托。在這種情況下,方法本身都
可以被代碼的其他部分顯式調用,當然,這個部分必須是某個類或結構的成員。
然而,如果方法只會被使用一次一一用來實例化委托會怎么樣呢?在這種情況下,除了創建
委托的語法需要,沒有必要創建獨立的具名方法。匿名方法讓我們無須使用獨立的具名方法。
匿名萬法(anonymousmethod)是在實例化委托時內聯(inline)聲明的方法。例如,圖14-12
演示了同一個類的兩個版本。左邊的版本聲明并使用了一個名為Add20的方法。右邊的版本使用
了匿名方法。沒有底色的代碼部分對于兩個版本是一樣的。

比較具名方法和匿名方法

使用匿名方法

我們可以在如下地方使用匿名方法。

  • 聲明委托變量時作為初始化表達式。
  • 組合委托時在賦值語句的右邊。
  • 為委托增加事件時在賦值語句的右邊。第15章會介紹事件。

匿名方法的語法

匿名方法表達式的語法包含如下組成部分。

  • delegate類型關鍵字。
  • 參數列表,如果語句塊沒有使用任何參數則可以省略。
  • 語句塊,它包含了匿名方法的代碼。

image

返回類型

匿名方法不會顯式聲明返回值。然而,實現代碼本身的行為必須通過返回一個與委托的返回
類型相同的值來匹配委托的返回類型。如果委托有void類型的返回值,匿名方法就不能返回值。

例如,在如下代碼中,委托的返回類型是int。因此匿名方法的實現代碼也必須在代碼路徑
中返回int。

delegate int OtherDel(int Inparam);static void Main()
{OtherDel del=delegate(int x){return x+20;   //返回一個整數類型};
}

參數

除了數組參數,匿名方法的參數列表必須在如下3方面與委托匹配:

  • 參數數量;
  • 參數類型及位置;
  • 修飾符。
    可以通過使圓括號為空或省略圓括號來簡化匿名方法的參數列表,但必須滿足以下兩個
    條件:
  • 委托的參數列表不包含任何out參數;
  • 若名方法不使用任何參數。
    例如,如下代碼聲明了一個沒有任何out參數的委托,和一個沒有使用任何參數的匿名方法。
    由于兩個條件都滿足了,所以可省略匿名方法的參數列表。
delegate void SomeDel(int X);   //聲明委托類型
SomeDel SDel=delegate           //省略參數列表
{PrintMessage();CleanUp();
}

params參數

如果委托聲明的參數列表包含了params參數,那么匿名方法的參數列表將忽略params關鍵
字。例如,在如下代碼中:

  • 委托類型聲明指定最后一個參數為params類型的參數;
  • 然而,匿名方法參數列表必須省略關鍵字。
//在委托類型聲明中使用params關鍵字
delegate void SomeDel(int X,params int[] Y);//在匹配的匿名方法中省略關鍵字
SomeDel mDel =delegate(int X,int [] Y)
{...
};

變量和參數的作用域

參數以及聲明在匿名方法內部的局部變量的作用域限制在實現代碼的主體之內,如圖14-13主
所示。

變量和參數的作用域

例如,上面的名方法定義了參數Y和局部變量z。在匿名方法主體結束之后,y和z就不
在作用域內了。最后一行代碼將會產生編譯錯誤。

外部變量

與委托的具名方法不同,匿名方法可以訪問它們外圍作用域的局部變量和環境。

  • 外圍作用域的變量叫作外部變量(outervariable)。
  • 用在匿名方法實現代碼中的外部變量稱為被方法捕獲。
    例如,圖14-14中的代碼演示了定義在匿名方法外部的變量×。然而,方法中的代碼可以訪
    問×并輸出它的值。

使用外部變量

捕獲變量的生命周期的擴展

只要捕獲方法是委托的一部分,即使變量已經離開了作用域,捕獲的外部變量也會一直有效。
例如,圖14-15中的代碼演示了被捕獲變量的生命周期的擴展。

  • 局部變量x在塊中聲明和初始化。
  • 然后,委托mDel匿名方法初始化,該匿名方法捕獲了外部變量x。
  • 塊關閉時,x超出了作用域。
  • 如果取消塊關閉之后的WriteLine語句的注釋,就會產生編譯錯誤,因為它引用的×現在
    已經離開了作用域。
  • 然而,mDel委托中的匿名方法在它的環境中保留了x,并在調用mDeI時輸出了它的值。

在匿名方法中捕獲的變量

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

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

相關文章

Cisco FMC events無法加載并且cpu high故障- Cisco bug

FMC故障 日志無法加載,并且CPU high 95% 經確認是bug問題,需要重置1個monetdb的進程 https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwe47671 https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwi64429 2.1 備份FMC配置 2.2 重置進程 大約為2…

HarmonyOS 公共事件機制介紹以及多進程之間的通信實現(9000字詳解)

HarmonyOS 公共事件機制介紹以及多進程之間的通信 CES(Common Event Service,公共事件服務)為應用程序提供訂閱、發布、退訂公共事件的能力 1. 公共事件的介紹 1.1.1公共事件的分類:公共事件從系統的角度可以分為系統公共事件和自定義公共事件 系統公共事件&#x…

華為云Flexus+DeepSeek征文|快速搭建Dify LLM應用開發平臺教程

【摘要】本文介紹基于華為云Flexus X實例快速部署Dify-LLM應用開發平臺的解決方案。通過創建云服務器(2核4G配置)、彈性公網IP(300Mbps帶寬)及安全組,實現平臺私有化部署。方案提供兩種計費模式(按需197元/…

【blender】使用bpy對一個obj的不同mesh進行不同的材質貼圖(涉及對bmesh的操作)

BMesh 簡介 BMesh 是 Blender 中用于表示和操作網格數據的底層數據結構系統,它是傳統網格數據結構的高級替代品。 主要特點 靈活拓撲支持: 支持 n-gons(任意邊數的多邊形),而不僅僅是三角形和四邊形允許邊和頂點不屬…

如何通過nvm切換本地node環境詳情教程(已裝過node.js更改成nvm)

針對系統已裝過node環境或者第一次安裝nvm環境如何切換nvm 文章目錄 系列文章目錄前言一、刪除原有node環境二、使用步驟 1.下載nvm軟件2.安裝node不同版本3.使用node版本4.配置包文件、安裝包、配置包環境 總結 一、刪除原有node環境 1、刪除之前安裝的node包,以及…

概率論符號和公式整理

本文是由AI生成后,經作者優化整理的文章。個人總結,僅限參考! 以下整理了概率論中的常用符號和公式表格,覆蓋基礎知識、關鍵定理和常用分布: 一、基礎集合與事件符號 符號名稱含義/公式說明 S S S樣本空間所有可能結…

SpringSecurity是什么?

Spring Security是Spring生態中的安全框架,用于管理Web應用的認證與權限控制,支持多種登錄方式并集成防護機制,可防范CSRF/XSS等攻擊,保障企業級系統的安全性。 一、核心功能與定位 身份認證(Authentication&#xff…

nt!IoSynchronousPageWrite函數分析之atapi!IdeReadWrite----非常重要

第一部分:預分析 1: kd> g Breakpoint 7 hit atapi!IdeReadWrite: f729cb2a 55 push ebp 1: kd> kc # 00 atapi!IdeReadWrite 01 atapi!IdeSendCommand 02 atapi!AtapiStartIo 03 atapi!IdeStartIoSynchronized 04 nt!KeSynchronizeExecuti…

軟考系統架構設計師經驗總結

本文目的 對參加的2025年上半年系統架構設計師考試進行總結提供一些備考思路給未來參加系統架構設計師的同學 個人背景 工作背景 本科計算機與技術(學過一些計算機基礎課程),15年畢業后從事過b端(人群畫像、營銷、用戶增長、硬…

Tailwind CSS工作原理

文章目錄 前言1. 指令解析與 AST 操作🚩 **核心處理流程**🧩 **具體流程說明** 2. **配置驅動的樣式生成**3. **JIT 模式(Just-In-Time)的核心邏輯**4. **插件與自定義擴展**5. **與 PostCSS 管道的協同**6. **優化與 Tree Shakin…

web網頁開發,在線%旅游景點管理%系統demo,基于Idea,vscode,html,css,vue,java,maven,springboot,mysql

經驗心得 兩業務單,都是業務邏輯開發,基本crud,什么是前后端,怎么分離前后端,前后端怎么通訊的,是以什么格式進行通訊這些咱們都需要掌握,后面剩下就是前后端不同層如何優化。管理系統很常見了其…

面試150 長度最小的子數組

思路 聯想到滑動窗口法。左窗口的值為0,遍歷數組對數組求和,當數組的和大于等于target的時候,窗口要收縮,計算子數組的長度,并及時更新最小的長度,左窗口右移。 class Solution:def minSubArrayLen(self,…

Python字典的查詢操作

一、前言 在 Python 中,字典(dict) 是一種非常常用的數據結構,以鍵值對(Key-Value Pair)形式存儲數據,支持快速查找、插入和刪除操作。 本文將系統性地介紹 Python 字典中常見的查詢操作方法&…

pyhton基礎【18】面向對象基礎一

目錄 一.面向對象 二.面向對象概述 三.類與對象 一.面向對象 Python中的面向對象編程OOP是一種編程范式,它使用對象來設計軟件。對象是具有屬性(稱為屬性)和可以執行的操作(稱為方法)的數據結構。 基礎概念 類:class 類是創建對象的藍圖或模板。它…

Requests源碼分析:面試考察角度自驗(初級)

簡單描述執行流程 Q:能簡單描述一下發送一個requests.get(url)請求時,在requests庫內部的主要執行流程嗎?(從調用get方法到收到響應) 入口委托: get() 方法內部調用 requests.request(GET, url)。Session 接管: request() 方法會獲取或隱式創建一個 Session 對象,并調用…

鴻蒙5:條件-循環-列表渲染

注意:博主有個鴻蒙專欄,里面從上到下有關于鴻蒙next的教學文檔,大家感興趣可以學習下 如果大家覺得博主文章寫的好的話,可以點下關注,博主會一直更新鴻蒙next相關知識 專欄地址: https://blog.csdn.net/qq_56760790/…

淺談AI大模型-MCP

MCP簡介 MCP(Model Context Protocol,模型上下文協議 ),24年11月初的時候Anthropic發了一篇技術博客,推出了他們的模型上下文協議MCP,介紹了一種規范:應用如何為LLM提供上下文。官網稱MCP為AI應…

MySQL數據庫基礎概述

前言: MySQL作為全球應用最廣泛的開源關系型數據庫管理系統(RDBMS)?,憑借其高性能、高可靠性與零成本特性,已成為Web應用、企業系統的核心數據引擎。它遵循SQL標準,通過表結構實現數據的結構化存儲&#x…

桌面小屏幕實戰課程:DesktopScreen 16 HTTP

飛書文檔http://https://x509p6c8to.feishu.cn/docx/doxcnrxBs55qGn6xoysTcJpqwRf /home/kemp/work/esp/esp-idf/examples/protocols/http_request 源碼下載方式參考: 源碼下載方式 心知天氣 注冊賬號,申請產品,獲取密鑰 產品 天氣數據 H…

vs2019 + QT下 vs2019創建的項目打開ui文件失敗

問題: 在vs2019 QT模式下。使用2019創建工程后。點擊ui文件打開時。出現奔潰,如下圖 解決方式: ui文件->右鍵->打開方式->添加->程序->點擊三個點->qcreator(qt安裝目錄) ->設置為默認值->確定 點擊設置為默認值,點…