我刚刚编写了一些我不太了解其工作原理的代码。
我的问题是关于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);
}
答案 0 :(得分:3)
这是通过Closure完成的。
基本上你可以想象代表你创建了一个小类,它有两个属性用于本地变量,还有一个函数。当你的lambda被调用时,它基本上会释放其中一个并调用函数,从而保留赋予它的值。
The C# specification实际上有一些关于如何通过编译器完成此操作的非常好的示例。特别是第6.5.3节
答案 1 :(得分:1)
他们被称为闭包,见维基百科:http://en.wikipedia.org/wiki/Closure_(computer_science)
基本上,它们允许在lambdas中使用非局部变量。根据我的记忆,这些变量是从您的函数外部编译的,因此可以全局使用。