C#完成在匿名辦法中捕捉內部變量的辦法。本站提示廣大學習愛好者:(C#完成在匿名辦法中捕捉內部變量的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#完成在匿名辦法中捕捉內部變量的辦法正文
先來一段代碼引入主題。假如你可以直接說出代碼的輸入成果,解釋本文不合適你。(代碼引自《深刻懂得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(); } }
謎底在本文最下方。
先引入兩個界說:
1、內部變量:是指感化域內包含匿名辦法的部分變量或參數。
2、捕捉的內部變量:是指在匿名辦法中應用的內部變量。
界說有點籠統,針對下面的代碼而言,inside和outside都是匿名辦法的內部變量,而inside和outside異樣也作為被匿名辦法捕捉的內部變量,由於在匿名辦法體中援用了這兩個變量。
而被匿名辦法捕捉到的是變量自己,而並不是變量的值。針對下面的代碼而言,履行outside++和inside++時,操作的其實就是內部的inside和outside變量。
至此,我們應當可以得出outside的變更應當是從0到4。
那末法式的輸入也應當是這個模樣的:(X代碼未知)
(0,X) (1,X) (2,X) (3,X) (4,X)
現實上,在for輪回體外面做的器械就是實例化了兩個TestDelegate拜托對象:delegate[0]和delegate[1]
而輪回的履行,現實上會實例化兩個稱號都為inside的變量。
這兩個變量之間沒有甚麼聯系關系,僅僅是稱號一樣罷了。
這兩個變量分離作為delegate[0]和delegate[1]的內部捕捉變量。也就是delegate[0]和delegate[1]在操作inside時,是互不影響的。
因而,得出謎底:
(0,0) (1,1) (2,2) (3,0) (4,1)
謎底