编写内联事件处理程序是不好的做法

时间:2010-10-31 15:41:40

标签: c# event-handling inline-code

编写内联事件处理程序是不好的做法吗?

对我来说,当我想在事件处理程序中使用局部变量时,我更喜欢使用它,如下所示:

我更喜欢这个:

// This is just a sample
private void Foo()
{
    Timer timer = new Timer() { Interval = 1000 };
    int counter = 0; // counter has just this mission
    timer.Tick += (s, e) => myTextBox.Text = (counter++).ToString();
    timer.Start();
}

而不是:

int counter = 0; // No need for this out of Boo & the event handler

private void Boo()
{
    Timer timer = new Timer() { Interval = 1000 };

    timer.Tick += timer_Tick;
    timer.Start();
}

void timer_Tick(object sender, EventArgs e)
{
    myTextBox.Text = (counter++).ToString();
}

3 个答案:

答案 0 :(得分:71)

这绝对没问题 - 虽然有两点需要注意:

  • 如果您要从闭包中修改局部变量,则应确保了解自己正在做什么。
  • 您将无法取消订阅活动

通常我只内联真正的简单事件处理程序 - 对于任何更复杂的事情,我使用lambda表达式(或匿名方法)通过使用更合适的方法调用方法来订阅:

// We don't care about the arguments here; SaveDocument shouldn't need parameters
saveButton.Click += delegate { SaveDocument(); };

答案 1 :(得分:3)

在大多数情况下,我宁愿使用像“timer_Tick()”这样的单独方法,但是我应该把它称为OnTimerTick():

  • 当我读到课程时,小麦正在进行中。 “On”告诉我它的can事件处理程序。
  • 在“内联”案例中,更容易在方法中设置断点。
  • 该事件在“Foo”承包商返回后很长一段时间被解雇,我不认为它在承包商的范围内运行。

但是如果只在方法之前触发事件,那么它被声明为内联返回,并且设置事件的对象的范围仅限于声明方法,那么我认为是“在线”版本更好。因此,我喜欢使用“in line”将比较委托传递给“sort”方法。

答案 2 :(得分:0)

您将两个样本放在一起。很明显,第二个选项(你不喜欢)是最具可读性的。

代码可读性和可维护性非常重要。保持简单,尽可能容易理解。大多数人通常认为Lambda表达式难以理解。即使它们是你的第二天性,也可能不是。