代码之家  ›  专栏  ›  技术社区  ›  dlras2

为事件处理程序使用lambda表达式的最佳实践

  •  11
  • dlras2  · 技术社区  · 15 年前

    在发现lambda表达式并将其用作匿名函数之后,我发现自己编写了许多更琐碎的事件,例如:

    txtLogin.GotFocus += (o, e) =>
    {
        txtLogin.Text = string.Empty;
        txtLogin.ForeColor = SystemColors.ControlText;
    };
    txtLogin.LostFocus += (o, e) =>
    {
        txtLogin.Text = "Login...";
        txtLogin.ForeColor = SystemColors.InactiveCaptionText;
    };
    

    我也不再使用只调用其他函数的事件处理程序,取而代之的是小lambda,它们也做同样的事情:

    backgroundWorker.DoWork += (o, e) => DatabaseLookup.Open(e.Argument as string);
    

    我发现了一些类似的问题 performance concerns can't remove them ,但我还没有找到任何解决这个简单问题的方法 这是个好主意吗?

    以这种方式使用lambdas是一种好的形式,还是更多有经验的程序员会看不起这一点?它是将事件处理程序隐藏在难以找到的地方,还是通过减少琐碎事件处理程序的数量来编写服务代码?

    3 回复  |  直到 8 年前
        1
  •  16
  •   Jon Skeet    15 年前

    这是一个非常合理的想法-但在这种情况下,我会使用匿名方法:

    txtLogin.LostFocus += delegate
    {
        txtLogin.Text = "Login...";
        txtLogin.ForeColor = SystemColors.InactiveCaptionText;
    };
    

    只有 匿名方法相对于lambda表达式的优势。

    IDisposable 这将删除订阅,如果你调用它。非常整洁。)

        2
  •  1
  •   James Curran    15 年前

    实际上,把事件处理程序放在容易找到的地方,也就是说,就在它被分配到的事件的名称旁边,是一种很好的方法。

    很多时候,您会看到如下事件处理程序:

     void Text1_KeyDown(....) {....}
    

    附加到txtFirstName的KeyUp事件,因为在使用Intellisense创建处理程序之后,有人决定重命名textbox,KeyUp工作得更好。通过Lambda,对象、事件和函数都在一起。

        3
  •  -1
  •   Grant Crofton    15 年前

    这是个棘手的问题。我记得我在图书馆看书 Code Complete 关于一些(聪明的)人如何说你应该保持控制流尽可能简单,许多人主张一个方法只有一个入口和出口,因为不这样做会使程序更难遵循。

    兰博达离这一点越来越远,在某些情况下很难跟踪所发生的事情,控制权从一个地方跳到另一个地方。

    基本上,我认为这可能是一个坏主意,因为这一点,但它也强大,使生活更容易。我当然用了不少。总之,小心使用!

    推荐文章