常见事件处理的最佳实践



在WinForms解决方案中,您有多个相同类型的控件。您需要向每个控件添加一个事件处理程序,并且当前事件处理程序将执行相同的操作。你不希望它们之间有任何原因的差异。

例如:

ScheduledPatientsGrid.ProcessGridKey += ScheduledPatientsGrid_ProcessGridKey;
RecentPatientsGrid.ProcessGridKey += RecentPatientsGrid_ProcessGridKey;
RecentPatientsGrid.ProcessGridKey += RecentPatientsGrid_ProcessGridKey;
... 
private void ScheduledPatientsGrid_ProcessGridKey(object sender, KeyEventArgs e)
{
   ...
}
private void RecentPatientsGrid_ProcessGridKey(object sender, KeyEventArgs e)
{
   ...
}
private void PatientsGrid_ProcessGridKey(object sender, KeyEventArgs e)
{
   ...
}
现在,是在不同事件

之间共享单个事件处理程序(如下所示)更好,还是使用不同的事件处理程序(如上面所示的代码示例)更好?

ScheduledPatientsGrid.ProcessGridKey += ProcessGridKey;
RecentPatientsGrid.ProcessGridKey += ProcessGridKey;
RecentPatientsGrid.ProcessGridKey += ProcessGridKey;                

private void ProcessGridKey(object sender, KeyEventArgs e)
{
  ...
}

在下一页中,Microsoft似乎建议共享更好,但是我注意到他们自.NET 2.0(即:Visual Studio 2008)以来就没有更新过它。

http://msdn.microsoft.com/en-us/library/4ac48519%28v=vs.90%29.aspx

在这种情况下,是否有指南提出最佳实践建议?

绝对会使用相同的方法。拥有多个完全相同的方法有什么可能的好处,没有一个被命名为说它的作用?

就我个人而言,我厌恶Visual Studio产生的source_EventName惯例。我更喜欢为我的事件处理程序方法提供有意义的名称,说明它们的作用。然后,当您在设计器中查看事件处理程序列表时,您可以看到单击按钮时,将发生 X,而不是"将调用按钮的单击事件处理程序",这是无用的。

或者,使用 lambda 表达式订阅事件并使用有意义的参数调用有意义的方法。(senderargs对于事件处理程序通常毫无用处。

在这种情况下,我通常让他们包装一个常用方法,但我保留他们的事件处理程序根据使用情况命名。 这使我可以轻松地对方法进行单元测试并(通常)减少所需的参数,并且堆栈跟踪中的任何错误对于进程失败的网格都非常可读:

ScheduledPatientsGrid.ProcessGridKey += ScheduledPatientsGrid_ProcessGridKey;
RecentPatientsGrid.ProcessGridKey += RecentPatientsGrid_ProcessGridKey;
RecentPatientsGrid.ProcessGridKey += RecentPatientsGrid_ProcessGridKey;
... 
private void ScheduledPatientsGrid_ProcessGridKey(object sender, KeyEventArgs e)
{
   ProcessGridKey(e.Key);
}
private void RecentPatientsGrid_ProcessGridKey(object sender, KeyEventArgs e)
{
   ProcessGridKey(e.Key);
}
private void PatientsGrid_ProcessGridKey(object sender, KeyEventArgs e)
{
   ProcessGridKey(e.Key);
}
private void ProcessGridKey(Key e)
{
    ...
}

您的里程可能会有所不同,具体取决于共享方法的功能或传入的参数。 (例如,在上面的示例中,我复制了从KeyEventArgs中提取Key

我更喜欢分享,如果逻辑失控,您可以随时将单个事件用作路由器的正确方法,例如......

private void ProcessGridKey(object sender, KeyEventArgs e)
{
     if (sender is x)
          xmethod();
     if (sender is y)
          ymethod();    //etc 
}

我知道这种语法不太有意义,因为发送者在 OP 示例中始终是同一个对象,但你明白了。

相关内容

  • 没有找到相关文章

最新更新