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

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

对于我来说,我更喜欢在事件处理程序中使用本地variables时使用它,如下所示:

我更喜欢这个:

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

这是绝对好的 – 虽然有两个警告:

  • 如果你在闭包中修改一个局部variables,你应该确保你明白你在做什么。
  • 您将无法取消订阅活动

通常我只内联真正简单的事件处理程序 – 对于更多的事情,我使用lambdaexpression式(或匿名方法)通过调用更合适的方法来调用方法:

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

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

  • 当我读课时,小麦越来越清晰了。 “On”告诉我它的can事件处理程序。
  • 在“inline”情况下,在方法中设置断点更容易。
  • 在“Foo”承包商回来之后,这个事件被解雇很久了,我认为这不是承包商的范围。

但是,如果事件只会在方法声明之前被触发,并且事件被设置的对象有一个范围,那么声明的方法是有限的,那么我认为“在线”版本更好。 因此,我喜欢使用“在线”比较委托被传递给“sorting”的方法。

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

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