2

我只是写了一些我不太理解它是如何工作的代码。

我的问题是关于 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);
}
4

2 回答 2

3

这是通过Closure完成的。

基本上你可以想象已经为你创建了一个小类,它有两个用于局部变量的属性和一个函数。当您的 lambda 被调用时,它基本上会通知其中一个并调用该函数,从而保留给它的值。

C# 规范实际上有一些非常好的例子来说明编译器是如何完成的。特别是第 6.5.3 节

于 2012-08-24T01:22:22.573 回答
1

它们被称为闭包,参见维基百科:http ://en.wikipedia.org/wiki/Closure_(computer_science )

基本上,它们允许在 lambda 中使用非局部变量。据我所知,这些变量是从您的函数外部编译的,因此可以在全局范围内使用。

于 2012-08-24T01:23:37.637 回答