循环中匿名方法的不同"执行上下文"的问题

Flo*_*ian 8 .net c# anonymous-methods

我在循环中有一个匿名方法的问题.

以下代码只是为了说明我的问题:

private void Form1_Load(object sender, EventArgs e)
{
    List<string> bassists = new List<string>(){
        "Jaco Pastorius", 
        "Marcus Miller", 
        "Flea", 
        "Vicor Wooten"
    };

    foreach (string item in bassists)
    {
        this.button1.Click += (s, ea) => Output(s, ea, item); 
    }
}

private void Output(object s, EventArgs e, string item)
{
    this.listBox1.Items.Add(item);
}
Run Code Online (Sandbox Code Playgroud)

当我点击按钮时,输出是:

Victor Wooten
Victor Wooten
Victor Wooten
Victor Wooten

代替:

Jaco Pastorius
Marcus Miller
Flea
Vicor Wooten

我的问题的主要问题是不同的执行上下文.我知道我的例子是愚蠢的.

jas*_*son 12

这是捕获的变量问题.通过改变来修复它

foreach (string item in bassists)
{
    this.button1.Click += (s, ea) => Output(s, ea, item); 
}
Run Code Online (Sandbox Code Playgroud)

foreach (string item in bassists)
{
    string currentItem = item;
    this.button1.Click += (s, ea) => Output(s, ea, currentItem); 
}
Run Code Online (Sandbox Code Playgroud)

以下是对该问题的解释:关闭循环变量被认为是有害的.通过将局部变量currentItem放在循环的范围内并关闭它,我们现在捕获该变量而不是循环变量.