常见事件处理的最佳实践

Adr*_*ian 2 .net c# event-handling winforms

在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)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

现在,如下所示在不同事件之间共享单个事件处理程序或使用上面显示的代码示例中的不同事件更好吗?

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


private void ProcessGridKey(object sender, KeyEventArgs e)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

在这种情况下是否有指南提出最佳做法建议?

Jon*_*eet 10

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

我个人厌恶source_EventNameVisual Studio产生的约定.我宁愿把我的事件处理方法有意义的名字,这不能不说它们是什么做的.然后当你向下看设计器中的事件处理程序列表时,你会发现当单击一个按钮时,X将发生而不是"按钮的click事件处理程序将被调用",这是无用的.

或者,使用lambda表达式订阅事件并使用有意义的参数调用有意义的方法.(对于事件处理程序而言sender,args它们通常没用.)

  • 再考虑一下(yay评论垃圾邮件),它在注册听众时甚至更有意义.`MyButton.Click + = MyButton_Click`告诉我_绝对没有_将会发生什么.`MyButton.Click + = ValidateFormInput`告诉我按钮将在点击时执行验证; 它更有用和可读.:d (4认同)