亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#實現(xiàn)在匿名方法中捕獲外部變量的方法

 更新時間:2015年03月31日 08:50:19   投稿:junjie  
這篇文章主要介紹了C#實現(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();
    }
  }


答案在本文最下方。

先引入兩個定義:

1、外部變量:是指作用域內(nèi)包括匿名方法的局部變量或參數(shù)。

2、捕獲的外部變量:是指在匿名方法中使用的外部變量。

定義有點抽象,針對上面的代碼而言,inside和outside都是匿名方法的外部變量,而inside和outside同樣也作為被匿名方法捕獲的外部變量,因為在匿名方法體中引用了這兩個變量。

而被匿名方法捕獲到的是變量本身,而并非變量的值。針對上面的代碼而言,執(zhí)行outside++和inside++時,操作的其實就是外部的inside和outside變量。

至此,我們應(yīng)該可以得出outside的變化應(yīng)該是從0到4。

那么程序的輸出也應(yīng)該是這個樣子的:(X代碼未知)

(0,X)

(1,X)

(2,X)

(3,X)

(4,X)

 

實際上,在for循環(huán)體里面做的東西就是實例化了兩個TestDelegate委托對象:delegate[0]和delegate[1]

而循環(huán)的執(zhí)行,實際上會實例化兩個名稱都為inside的變量。

這兩個變量之間沒有什么關(guān)聯(lián),僅僅是名稱一樣而已。

這兩個變量分別作為delegate[0]和delegate[1]的外部捕獲變量。也就是delegate[0]和delegate[1]在操作inside時,是互不影響的。

于是,得出答案:

(0,0)

(1,1)

(2,2)

(3,0)

(4,1)

答案

相關(guān)文章

最新評論