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放在循环的范围内并关闭它,我们现在捕获该变量而不是循环变量.
| 归档时间: |
|
| 查看次数: |
357 次 |
| 最近记录: |