c# - 循环内的外部变量如何与 lambda 一起使用?

标签 c# 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);
}

最佳答案

这是通过 Closure 完成的.

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

The C# specification实际上有一些非常好的例子来说明编译器如何完成此操作。具体来说第 6.5.3 节

关于c# - 循环内的外部变量如何与 lambda 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12102078/

相关文章:

c++ - 返回带有移动捕获的 lambda 函数

c# - 对于一个用户,从xml字符串导入DSA key 失败。权限?安装损坏? KSP错误?

function - 如何在 Scala 中使 lambda 函数通用?

c++ - Constexpr 变量在 Lambda 内部显示为未初始化

c# - LiteDB 5 System.IO.IOException : The process cannot access the file

elasticsearch - Terraform:CloudWatch记录到Elasticsearch

c++ - std::generate_n 的并行执行可变 lambda 生成器

c# - 防止 EDMX 合并冲突和 Cherry Picking 问题

c# - 在 ASP.NET Core 中覆盖 User.IsInRole

c# - DataReader::Dispose 应该调用 DataReader::Close 吗?