我刚刚编写了一些代码,但我不太理解它是如何工作的。
我的问题是关于 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);
}
最佳答案
这是通过 Closure 完成的.
基本上,您可以想象已经为您创建了一个小类,它具有两个用于局部变量的属性和一个函数。当你的 lambda 被调用时,它基本上会更新其中一个并调用该函数,从而保留赋予它的值。
The C# specification实际上有一些非常好的例子来说明编译器如何完成此操作。具体来说第 6.5.3 节
关于c# - 循环内的外部变量如何与 lambda 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12102078/