2009-04-11 1 views
3

あなたはどうなる:1つの汎用イベント名または複数のわかりやすいイベント名

this.btSomeButton.Click += btSomeButton_OnClick; 

private void btSomeButton_OnClick(object sender, EventArgs e) 
{ 
    this.DoFunc1(); 
    this.DoFunc2(); 
} 

または:

this.btSomeButton.Click += DoFunc1; 
this.btSomeButton.Click += DoDunc2; 

を第二の方法を使用するための任意の隠された意味がありますか? DoFunc1()の後にDoFunc2()が実行されることは保証されていますか?

答えて

2

私は最初の方法がより安全だと思います。

AFAIKメソッドの実行順序は保証されておらず、メソッドが順番に並んでいれば最初の方法はとにかく意味があります。

また、複数のイベントハンドラがイベントにアタッチされている場合、個々のイベントハンドラを切り離すと、他のイベントを見逃しやすくなります。

+2

実行順序は保証されていますが(http://msdn.microsoft.com/en-us/library/system.multicastdelegate.aspx参照)、最初の方法を使用するのは依然として明確です。 –

0

私も最初にしてください。..

もパフォーマンスが2例で同じに非常に近いはずであるが、#1は、私見読みやすいですが - しかし、それはみかん、彼らが何をしているかに依存します。私は例のためにこれを好むだろう:(ドメイン視点から話して)あなたは1つの、共通の手順に2イベントハンドラを結び付けることができればP

this.btSomeButton.Click += DoSomethingRelatedToDataPersistence; 
this.btSomeButton.Click += DoSomethingRelatedToTheDirectionTheMoonSpinsAroundTheEarth; 

..私はあなたが私のドリフトをキャッチ願っています私はそれをやるだろう。ハンドラが完全に関連していない場合、私はそれらを別のハンドラに入れておきます。

答えは非常に主観的です。誰も「最終回答、ケース・クローズ」を提供することはできません。

0

私は、それが従来の方法であるという理由だけであれば、他の開発者にはより明確になるようにしたいと思います。イベントハンドラのジャグリングは、どのような場合でもトレースするのは難しいので、誰もができるだけ多くの助けをするようにしてください。

0

に依存します。すべて(あるいはほとんど)は、以下の該当する場合

私は2番目のオプションを使用します。

  • はDoFunc1とDoFunc2は、機能性の観点から、それぞれ、他の完全に独立しています。
  • 呼び出しの順序は問題ではありません(例外などの場合でも)。
  • DoFunc1とDoFunc2には、標準のイベントパラメータを受信する際にシグネチャの問題はありません。
  • DoFunc1とDoFunc2は、設計のコンテキストではプリミティブ関数ではありません。
  • ソースコードの領域によって、必要な加入者数を決めることができます。
  • DoFunc1とDoFunc2は、デカップリングする必要がある他のクラスの一部です。
  • DoFunc1とDoFunc2が購読または購読中止のときにカスタム処理を行いたいと思います。

注文が重要な場合は、最初のオプションははっきりとしている必要があります。私はC#言語仕様が第2のオプションで注文を保証するかどうかはわかりません。

0

ああ、今質問があります。これはMulticast Delegatesに関する質問です。ドキュメントによると...

MulticastDelegateには、1つまたは複数の要素からなる呼び出しリストと呼ばれるデリゲートのリンクリストがあります。マルチキャストデリゲートが呼び出されると、呼び出しリスト内のデリゲートは、表示される順に同期的に呼び出されます。

しかし、コールの発注に気をつければ、私はこれに頼るつもりはなく、最初の方法または以下の方法を使用します。

あなたは、両方行うことができますが、構文が好きですが、両方の呼び出しの機能の抽象化をしたい...

this.btSomeButton.Click += (sender, args) 
{ 
    this.doFunc1(); 
    this.doFunc2(); 
}; 
+0

これは、btSomeButton_OnClickを匿名にして最初のオプションと意味的に同じだと思います。 – isntn

+0

はい、ただし、anon delegateとlambda構文があります。 –

0

場合、私は、単一の(主観的な)理由で、最初のオプションを好みます。

これははるかに説明的であり、後で他の人々が理解しやすくなります。これは、イベントが、後で購読を解除する必要があるイベントの場合に重要になります。購読を解除する必要がある1つのイベントは、2つのイベントよりも将来他の人によって適切に処理される可能性が高くなります。

実行順序について質問したので、これは2つの関数が関連していることを示しています。これにより、イベントの強制終了が強制されますので、func1()ではなくfunc2()からの退会が可能ではありません。実行の順序が気になる場合は非常に重要です(btwは保証されています) )。

関連する問題