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

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

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

我更喜欢这样:

// 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();
}
47951 次浏览

这绝对没问题——尽管有两点需要注意:

  • 如果您正在从闭包内部修改局部变量,那么您应该确保您了解自己在做什么。
  • 您将无法从事件中取消订阅

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

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

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

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

在大多数情况下,我更愿意使用“ timer _ Tick ()”这样的独立方法,但是我更愿意将它称为 OnTimerTick () ,因为:

  • 当我读课文的时候,更加清楚小麦是怎么回事了。“ On”告诉我它的 can 事件处理程序。
  • 在“ inline”情况下,更容易在方法中设置断点。
  • 这个活动是在“ Foo”承包商回来后很长时间才开始的,我不认为它在承包商的范围内运行。

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