C#實(shí)現(xiàn)在匿名方法中捕獲外部變量的方法
先來一段代碼引入主題。如果你可以直接說出代碼的輸出結(jié)果,說明本文不適合你。(代碼引自《深入理解C#》第三版)
class Program { private delegate void TestDelegate(); static void Main(string[] args) { TestDelegate[] delegates = new TestDelegate[2]; int outside = 0; for(int i = 0; i < 2; i++) { int inside = 0; delegates[i] = delegate { Console.WriteLine("({0},{1})", outside, inside); outside++; inside++; }; } delegates[0](); delegates[0](); delegates[0](); delegates[1](); delegates[1](); Console.ReadKey(); } }
答案在本文最下方。
先引入兩個(gè)定義:
1、外部變量:是指作用域內(nèi)包括匿名方法的局部變量或參數(shù)。
2、捕獲的外部變量:是指在匿名方法中使用的外部變量。
定義有點(diǎn)抽象,針對(duì)上面的代碼而言,inside和outside都是匿名方法的外部變量,而inside和outside同樣也作為被匿名方法捕獲的外部變量,因?yàn)樵谀涿椒w中引用了這兩個(gè)變量。
而被匿名方法捕獲到的是變量本身,而并非變量的值。針對(duì)上面的代碼而言,執(zhí)行outside++和inside++時(shí),操作的其實(shí)就是外部的inside和outside變量。
至此,我們應(yīng)該可以得出outside的變化應(yīng)該是從0到4。
那么程序的輸出也應(yīng)該是這個(gè)樣子的:(X代碼未知)
(0,X) (1,X) (2,X) (3,X) (4,X)
實(shí)際上,在for循環(huán)體里面做的東西就是實(shí)例化了兩個(gè)TestDelegate委托對(duì)象:delegate[0]和delegate[1]
而循環(huán)的執(zhí)行,實(shí)際上會(huì)實(shí)例化兩個(gè)名稱都為inside的變量。
這兩個(gè)變量之間沒有什么關(guān)聯(lián),僅僅是名稱一樣而已。
這兩個(gè)變量分別作為delegate[0]和delegate[1]的外部捕獲變量。也就是delegate[0]和delegate[1]在操作inside時(shí),是互不影響的。
于是,得出答案:
(0,0) (1,1) (2,2) (3,0) (4,1)
答案
相關(guān)文章
C#使用Twain協(xié)議開發(fā)一個(gè)高掃儀對(duì)接功能
這篇文章主要為大家詳細(xì)介紹了C#如何使用Twain協(xié)議開發(fā)一個(gè)高掃儀對(duì)接功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02CAD2008+VS2008開發(fā)ObjectARX加載失敗問題(推薦)
這篇文章主要介紹了CAD2008+VS2008開發(fā)ObjectARX加載失敗問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04C#以太網(wǎng)Sockets服務(wù)器設(shè)計(jì)實(shí)現(xiàn)
本文主要介紹了C#以太網(wǎng)Sockets服務(wù)器設(shè)計(jì)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02C#實(shí)現(xiàn)獲取文本文件的編碼的一個(gè)類(區(qū)分GB2312和UTF8)
這篇文章主要介紹了C#實(shí)現(xiàn)獲取文本文件的編碼一個(gè)類,本文給出類可以自動(dòng)區(qū)分GB2312和UTF8,并同時(shí)給出了使用方法,需要的朋友可以參考下2014-09-09C#中參數(shù)數(shù)組、引用參數(shù)和輸出參數(shù)示例詳解
這篇文章主要給大家介紹了關(guān)于C#中參數(shù)數(shù)組、引用參數(shù)和輸出參數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05基于動(dòng)態(tài)修改App.Config與web.Config的使用詳解
本篇文章是對(duì)動(dòng)態(tài)修改App.Config與web.Config的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05使用checked語句防止數(shù)據(jù)溢出的解決方法
本篇文章是對(duì)用checked語句防止數(shù)據(jù)溢出的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05