在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
在这种情况下是否有指南提出最佳做法建议?
答案 0 :(得分:10)
我绝对使用相同的方法。有多种方法完全相同的方法有什么好处,没有一种方法可以说明它的用途?
我个人憎恶Visual Studio产生的source_EventName
约定。我更愿意为我的事件处理程序方法提供有意义的名称,这些名称表示他们做什么。然后当你向下看设计器中的事件处理程序列表时,你会发现当单击一个按钮时,X将发生而不是“将调用按钮的单击事件处理程序”,这是无用的。
或者,使用lambda表达式订阅事件并使用有意义的参数调用有意义的方法。 (sender
和args
通常对事件处理程序无用。)
答案 1 :(得分:1)
在这种情况下,我通常让它们包装一个常用方法,但我保留了按用法命名的事件处理程序。这使我可以轻松地对方法进行单元测试,并且(通常)减少所需的参数,并且堆栈跟踪中的任何错误都将非常易读,因为该过程失败了:
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)
{
...
}
您的里程可能会有所不同,具体取决于共享方法的作用或传入的参数。(例如,在我的上述示例中,我复制了从Key
中提取KeyEventArgs
。< / p>
答案 2 :(得分:0)
我更喜欢分享,如果逻辑失控,你可以随时使用单一事件作为路由器来使用正确的方法,如...
private void ProcessGridKey(object sender, KeyEventArgs e)
{
if (sender is x)
xmethod();
if (sender is y)
ymethod(); //etc
}
我知道这个语法没有多大意义,因为发送者在OP示例中始终是同一个对象,但是你明白了。