事件处理的一般最佳实践(方法)

时间:2013-08-08 21:10:25

标签: c# winforms c#-4.0

到目前为止,我将所有对事件有反应的代码直接放入事件处理方法中 昨天我看到有人提到只有最少的代码应该去那里 真的吗 ?或者最佳做法是什么?

e.g。从程序平滑工作的角度来看哪一个例子更好,以及为什么,如果你可以: FIG1:

private void MainForm_DragDrop(object sender, DragEventArgs e)
{
    var DropPosX = e.X;   
    string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);    
    for (int i = 0; i < s.Length; i++)
    {
        CheckFile(s[i])
        LoadFile(s[i]);
        // ..big chunk of code..
    }    
    // ..big chunk of code..    
}

Fig2:

DoDragDrop(int[] s, int DropPosX)
{
    for (int i = 0; i < s.Length; i++)
    {
        CheckFile(s[i])
        LoadFile(s[i]);
        // ..big chunk of code..
    }    
    // ..big chunk of code..
}

private void MainForm_DragDrop(object sender, DragEventArgs e)
{
    var DropPosX = e.X;    
    string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);    
    DoDragDrop(s, DropPos);
}

..甚至是 图三:

int DropPosX;
string[] s;

DoDragDrop()
{
    for (int i = 0; i < s.Length; i++)
    {
        CheckFile(s[i])
        LoadFile(s[i]);
        // ...
    }    
    // ...
}

private void MainForm_DragDrop(object sender, DragEventArgs e)
{
    DropPosX = e.X;    
    s = (string[])e.Data.GetData(DataFormats.FileDrop, false);    
    DoDragDrop();
}

2 个答案:

答案 0 :(得分:2)

大多数事件处理程序基本上采取以下两个操作

  • 从活动中收集相关数据,可能只是事件发生
  • 使用收集的数据执行操作

听起来这个人建议你将这些逻辑操作分解为两种不同的方法。这是合理的推理,但它也是一个风格问题。这样做并不能使你的程序或多或少地正确。虽然我通常发现如果采用这种方法,代码更容易测试。

虽然具体到这个样本。在这种情况下我不会使用实例变量。被拖动的项目和位置与DoDragDrop方法相关,应作为参数传递。如果需要保留该数据,那么DoDragDrop应该是设置实例值的那个。

private void MainForm_DragDrop(object sender, DragEventArgs e)
{
    int position = e.X;    
    string[] items = (string[])e.Data.GetData(DataFormats.FileDrop, false);    
    DoDragDrop(positon, items);
}

答案 1 :(得分:0)

是的,你应该尽量保持最低限度。

如果大量的代码被说成是一堆内部因素(例如表单控件,但你的目标是尽可能多地在事件处理程序之外),它会变得有点混乱。

所有这些都取决于大块代码是什么,但即使是本地私有方法也比eventHandler中的大量代码更好。

如果说您正在抓取UI属性以将它们存储在另一个类中。添加一个方法,将它们作为参数。

如果有很多UI内容,请查看UserControl。

这样做的主要原因是测试UI是一个很大的痛苦,因此UI中的逻辑越少,工作就越容易。