为控件创建事件处理程序或将其放在窗体的构造函数中?哪一个更好?

时间:2011-11-23 07:05:05

标签: c# winforms coding-style

这些解决方案中哪一个看起来更好,更清晰?

在form的构造函数中:

textBox1.KeyDown += delegate(object o, KeyEventArgs e)
{
    if (e.KeyCode== Keys.Enter)
    {
        button1.PerformClick();
    }
};

或者:

private void textBox1_KeyDown(object sender, KeyEventArgs e)

    {
        if (e.KeyCode == Keys.Return) 
        {
            button1.PerformClick();
        }
    }

5 个答案:

答案 0 :(得分:2)

实施的选择取决于我们不确切知道并且可能随时间变化的要求。

只要您的处理程序不应动态添加或删除或包含仅在运行时已知的任何数据,我认为没有理由将其包装到委托中并添加到表单中。并且您需要实现自己的析构函数/ Dispose()方法来显式删除此处理程序以防止内存泄漏。

所以,带静态处理程序的第二个解决方案在我看来似乎是最优的。然后,您可以轻松地在Visual Studio中的控件属性中直接查看textBox1控件实际实现的事件处理程序,如果需要稍后修改,则不必通过代码查找此处理程序实现。 / p>

答案 1 :(得分:1)

当你只有一个事件处理程序时,第一个看起来很好。但是,如果你有10个或20个怎么办?这将导致一个相当臃肿的构造函数。拥有事件处理程序肯定会更好,但即便如此,最好不要在事件处理程序中拥有大量业务逻辑。

此外,在构造函数中使用委托会阻止编辑并继续工作。

答案 2 :(得分:0)

这取决于:如果你能在设计时做到这一点,我更喜欢第二种 如果您使用第一个,请在关闭表单之前使用textBox1.KeyDown -=以避免内存泄漏。

答案 3 :(得分:0)

据我所知,第二个更清晰,看起来更好,但第一个帮助开发人员编码更快。

但是,两种解决方案取决于您的目的。

答案 4 :(得分:0)

这是一个风格问题,但是,就个人而言,我避免使用多行代码制作匿名代表。例如,这是我的作品

btnSave.Click += (sender, e) => Save();

@Marco,亚历山大: 如何使用这些事件处理程序泄漏内存?我认为只有当事件源是静态的时才会发生。