67

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

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

我更喜欢这个:

// 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();
}
4

3 回答 3

79

这绝对没问题 - 尽管有两个警告:

  • 如果你在一个闭包中修改一个局部变量,你应该确保你理解你在做什么。
  • 您将无法退订该活动

通常我只内联非常简单的事件处理程序 - 对于更多涉及的事情,我使用 lambda 表达式(或匿名方法)来订阅对具有更合适方法的方法的调用:

// We don't care about the arguments here; SaveDocument shouldn't need parameters
saveButton.Click += delegate { SaveDocument(); };
于 2010-10-31T15:51:16.087 回答
3

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

  • 当我阅读课程时,更清楚的是小麦正在发生。“On”告诉我它的 can 事件处理程序。
  • 在“内联”情况下,更容易在方法中设置断点。
  • 该事件在“Foo”承包商返回很长时间后被触发,我认为它不在承包商的范围内。

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

于 2010-11-01T10:59:03.787 回答
0

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

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

于 2010-10-31T21:12:27.997 回答