2012-08-24 46 views
2

我剛寫了一些代碼,我不太明白它是如何工作的。循環內的外部變量如何與lambda一起工作?

我的問題是關於for循環中的局部變量,然後在單選按鈕事件發生時被引用。

它如何跟蹤這些局部變量的不同「版本」並正確運行? (即所得到的單選按鈕各火災與從外局部變量衍生它們的相應值的事件)

public class RadioButtonPanel<T> : FlowLayoutPanel 
{ 
    public RadioButtonPanel() 
    { 
     foreach (object value in Enum.GetValues(typeof(T))) 
     { 
      string name = Enum.GetName(typeof(T), value); 
      var radioButton = new RadioButton { Text = name }; 
      radioButton.CheckedChanged += (s, e) => 
      { 
       if (radioButton.Checked && this.Selected != null) 
        Selected((T)Enum.Parse(typeof(T), name)); 
      }; 
      this.Controls.Add(radioButton); 
     } 
    } 

    public event SelectedEvent Selected; 
    public delegate void SelectedEvent(T t); 
} 

回答

3

這是通過Closure完成。

基本上,你可以想象一個小類是以你的名義爲你創建的,它有兩個局部變量屬性和一個函數。當你的lambda被調用時,它基本上會通知其中一個並調用該函數,從而保留賦予它的值。

The C# specification實際上有一些如何由編譯器完成的很好的例子。具體6.5.3節

1

他們被稱爲閉包,看維基百科:http://en.wikipedia.org/wiki/Closure_(computer_science

基本上,它們允許lambda表達式中使用非局部變量。從我記得的地方來看,這些變量是從你的函數外部編譯的,所以它們可以在全局範圍內使用。

相關問題