代码之家  ›  专栏  ›  技术社区  ›  Homam

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

  •  56
  • Homam  · 技术社区  · 14 年前

    编写内联事件处理程序是一种坏做法吗?

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

    我喜欢这样:

    // 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 回复  |  直到 14 年前
        1
  •  71
  •   Jon Skeet    14 年前

    这是绝对好的-尽管有两个警告:

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

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

    // We don't care about the arguments here; SaveDocument shouldn't need parameters
    saveButton.Click += delegate { SaveDocument(); };
    
        2
  •  3
  •   Ian Ringrose    14 年前

    在大多数情况下,我宁愿使用单独的方法,如__timer_tick()_,但我更愿意将其称为ontimertick(),如下所示:

    • 当我读到这门课的时候,就更清楚地看到了小麦的生长。on告诉我它的can事件处理程序。
    • 在内联情况下,更容易在方法中设置断点。
    • 该事件在承包商返回后很长一段时间内被解雇,我认为它不属于承包商的范围。

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

        3
  •  0
  •   Liviu Mandras    14 年前

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

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

    推荐文章