2012-10-19 75 views

回答

7

捕獲變量通常是指具有封閉件(基本上是一個內聯函數)捕獲的變量。 「捕獲」意味着內聯函數必須「捕獲」外函數中的變量的引用。爲此,C#編譯器生成一個內部類,並通過引用將外部變量傳遞給內部類(內聯函數隨後引用它)。如果你反彙編你的代碼,你可以看到這個。

考慮以下

void Main() 
{ 
    string s = "hello"; 
    Action a = delegate 
    { 
      Debug.WriteLine(s); 
    }; 
    s = "hello2"; 
    a(); 
} 

在上面的例子中,字符串變量s被內聯動作的拍攝。

在引擎蓋下,C#編譯器將創建一個內部類,該Action引用捕獲變量s的值。需要注意的是,字符串s是通過引用傳遞給Action a的,因此該操作實際上會打印出「hello2」,而不是「hello」。這可能會產生意想不到的副作用,如果不能清楚地理解,並且被稱爲「訪問修改後的封閉」。

+0

這值得一看: http://blogs.msdn.com/b/matt/archive/2008/03/01/understanding-variable-capturing-in-c.aspx – pencilCake