C#lambda表达式,作用域变量值

111*_*111 3 c# lambda closures scope event-handling

嗨,我正在尝试为事件处理程序编写lambda.所以我可以为被调用的方法提供更多信息.

所以我在做:

button.Click+=new EventHandler ((object sender, EventArgs args) => 
{ button_click (i, sender, args); });
Run Code Online (Sandbox Code Playgroud)

哪里:

public void button_click (int i, object sender, EventArgs eventArgs)
Run Code Online (Sandbox Code Playgroud)

好的,所以这个方法在调用方法中起作用,但i始终是最后已知的值i,我真的想要将lambda传递给事件的那个值.你是怎样做的?

谢谢

Jon*_*eet 5

只需创建变量的副本:

int currentI = i;
button.Click+=new EventHandler ((object sender, EventArgs args) => 
    { button_click (currentI, sender, args); });
Run Code Online (Sandbox Code Playgroud)

请注意,那里有一定数量的残余物.你可以更简单地写它:

int currentI = i;
button.Click += (sender, args) => button_click(currentI, sender, args);
Run Code Online (Sandbox Code Playgroud)

我个人会重命名该button_click方法以符合.NET命名约定.