【问题标题】:C# lambda expression, scoped variable valueC# lambda 表达式,作用域变量值
【发布时间】:2011-09-03 08:12:53
【问题描述】:

您好,我正在尝试为事件处理程序编写 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 调用中一样工作,但 i 始终是 i 的最后一个已知值,我真的想要 lambda 传递给事件的那个点的值。你是怎么做到的?

谢谢

【问题讨论】:

标签: c# lambda scope closures event-handling


【解决方案1】:

只需创建变量的副本:

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);

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

【讨论】:

  • 感谢 Jon 对它的怀疑,我也丢失了额外的花括号 :D,尽管我确实喜欢明确变量类型,因为它有助于自我记录代码。顺便说一句:那你会怎么称呼这个方法?再次感谢
  • @651bobby: 鉴于这是一个Click 事件,我认为这已经足够众所周知,类型会很明显。我会根据它所做的 来命名该方法,而不是调用它时发生的事情。但是从我们得到的代码中很难知道那是什么。如果你真的希望它与按钮点击相关联,我会称之为HandleButtonClick
  • 好的,谢谢,从现在开始我会这样做,但我仍然会根据个人喜好坚持我的明确输入。
猜你喜欢
  • 2014-02-20
  • 1970-01-01
  • 2017-04-21
  • 2010-10-20
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多