【问题标题】:Is it bad practice to write inline event handlers编写内联事件处理程序是不好的做法
【发布时间】:2010-10-31 15:41:40
【问题描述】:

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

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

我更喜欢这个:

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

【问题讨论】:

  • 是的,lambda 和闭包肯定是邪恶的......
  • 我认为这取决于您的团队。如果每个人都对这些功能感兴趣,那很好。我个人喜欢在单独的行上使 lambdas 更明显,等等。我喜欢这样编码,以便 1 行代码做 1 件事。
  • +1 @kenny 我同意你的观点,这使代码更清晰。
  • 也同意肯尼的观点。一旦您接受了 Jon 的回答并确定从技术角度(性能、可扩展性等)来说没问题,好的/坏的做法就是预测谁将在以后阅读或修改此代码以及他们将如何看待它,包括您自己在你忘记它的作用之后。

标签: c# event-handling inline-code


【解决方案1】:

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

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

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

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

【讨论】:

  • 这个答案可能会让人们走上一条坏路。不能取消订阅事件处理程序的重要性取决于应用程序。在内存受限的情况下(例如:在移动设备上),清理事件处理程序以确保 ViewControllers 和活动可以被正确地垃圾收集是很重要的。如果不这样做,可能会导致显着的内存分配增加,或者当一个事件针对位于导航返回堆栈中且当前未显示的屏幕触发时出现意外行为。根据您的用例了解是否可以不取消关联事件非常重要。
  • @SmartyP:用户应该知道他们是否需要取消订阅事件——这实际上不在这个问题的范围内,IMO。我已经明确表示他们不能这样做,这意味着如果他们需要,他们就会知道不要使用匿名函数。
  • 保留对委托的引用,以便以后可以将其删除。 stackoverflow.com/a/2915741/351245
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 就我个人而言,我发现 Lambda 语法在精神上解析起来更快,并且更喜欢第一个示例。但这是 4 年后的事了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多