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

C#lambda表达式,作用域变量值,c#,lambda,scope,closures,event-handling,C#,Lambda,Scope,Closures,Event Handling,嗨,我正在尝试为事件处理程序编写lambda。因此,我可以为调用的方法提供更多信息 因此,我正在做: button.Click+=new EventHandler ((object sender, EventArgs args) => { button_click (i, sender, args); }); 其中: public void button_click (int i, object sender, EventArgs eventArgs) 好的,这与get called

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

因此,我正在做:

button.Click+=new EventHandler ((object sender, EventArgs args) => 
{ button_click (i, sender, args); });
其中:

public void button_click (int i, object sender, EventArgs eventArgs)
好的,这与get called方法一样,但是
i
始终是
i
的最后一个已知值,我确实希望lambda传递给事件的点处的值。你是怎么做到的


谢谢

只需创建变量的副本:

int currentI = i;
button.Click+=new EventHandler ((object sender, EventArgs args) => 
    { button_click (currentI, sender, args); });
注意这里有一定量的原油。您可以更简单地写为:

int currentI = i;
button.Click += (sender, args) => button_click(currentI, sender, args);

就我个人而言,我会重新命名
按钮\u click
方法,以符合.NET命名约定。

感谢Jon使用了它,我也丢失了额外的大括号:d,尽管我确实喜欢明确说明变量类型,因为它有助于自我记录代码。顺便问一下:那么你会怎么称呼这个方法呢?谢谢again@651bobby:考虑到这是一个
点击
事件,我假设这是一个众所周知的事件,类型将是显而易见的。我会根据方法的功能来命名它,而不是根据它的调用来命名。很难从我们的代码中知道这是什么。如果你真的想把它绑定到按钮点击上,我会叫它类似于
HandleButtonClick
。好的,谢谢,从现在起我会这么做,但我还是会坚持我的显式输入作为个人偏好。请参阅以了解为什么要复制变量。