2

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

この場合のベストプラクティスの推奨事項を示すガイドはありますか?

4

3 に答える 3

10

私は絶対に同じ方法を使用します。まったく同じことを行う複数のメソッドを使用することには、どのような利点がありますか?

個人的には、VisualStudioがsource_EventName生み出す慣習を嫌います。私は、イベントハンドラーメソッドに、それらが何をするかを示す意味のある名前を付けることを好みます。次に、デザイナでイベントハンドラリストを見下ろすと、ボタンがクリックされたときに、「ボタンのクリックイベントハンドラが呼び出される」のではなく、Xが発生することがわかります。これは役に立ちません。

または、ラムダ式を使用してイベントをサブスクライブし、意味のあるパラメーターを使用して意味のあるメソッドを呼び出します。(senderおよびargsは、イベントハンドラーには役に立たないことがよくあります。)

于 2012-06-21T20:22:53.687 に答える
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ます。

于 2012-06-21T20:24:31.947 に答える
0

私は共有することを好みます。ロジックが手に負えなくなった場合は、いつでも単一のイベントをルーターとして使用して、次のような正しい方法を実行できます...

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

OPの例では送信者は常に同じオブジェクトであるため、この構文はまったく意味がないことを認識していますが、あなたはその考えを理解しています。

于 2012-06-21T20:23:30.507 に答える