2012-05-18 53 views
1

下面的代碼工作,但爲什麼?當我在循環中調用匿名方法時,x和y在哪裏出現/保存。匿名函數體變量在哪裏保存?

感謝

static void Main(string[] args) 
    { 
     int x=1; 
     int y=2; 
     var dic = GetDic(x, y); 

     for (int i = 0; i < 5;i++) 
     { 
      System.Console.WriteLine(dic[i].Invoke().ToString()); 
     } 

    } 

    private static Dictionary<int, Func<int>> GetDic(int x, int y) 
    { 
     var dic = new Dictionary<int, Func<int>>() 
     { 
      {0,()=>{return y;}}, 
      {1,()=>{return x;}}, 
      {2,()=>{return x+y;}}, 
      {3,()=>{return x-y;}}, 
      {4,()=>{return y-x;}}, 
     }; 
     return dic; 
    } 

回答

3

將Lambda表達式編譯爲單獨的方法。如果它們不使用來自周圍代碼的局部變量,則它們被編譯成同一類的方法。但是,在使用局部變量(如本例中)時,編譯器會在周圍類型中創建一個嵌套類,並將編譯的方法和字段與所使用的局部變量匹配。當使用lambda表達式時,將創建該類的一個實例,並將值存儲在實例字段中,以便lambda方法可以訪問它們。

這也意味着在lambda表達式中使用來自周圍方法的局部變量比僅使用其參數和其他類型的靜態成員的lambda表達式要稍微昂貴一些。

1

他們在代表們Target場保存在一個封閉生成的類。

欲瞭解更多信息,請參閱my blog post