2013-07-03 12 views
8

コンテキストMenuItemのようなものにイベントハンドラを割り当てることで、例えば、2つの許容構文があります。"new EventHandler"宣言の明示的な使用に利点がありますか?

MenuItem item = new MenuItem("Open Image", btnOpenImage_Click); 

は...と...

MenuItem item = new MenuItem("Open Image", new EventHandler(btnOpenImage_Click)); 

私も同じ表示されることを確認します

listView.ItemClick += listView_ItemClick; 

...と...

:このに適用します
listView.ItemClick += new ItemClickEventHandler(listView_ItemClick); 

第2の(明示的な)最初のものに特に有利な点はありますか?それとも、これは文体的な質問ですか?

答えて

9

C#1.0では、デリゲートの型とターゲットを明示的に定義するしかありませんでした。

コンパイラでは、メソッドグループから互換性のあるデリゲート型への暗黙的な変換によって、より簡潔な方法で自分自身を表現することができます。それは本当に文法的な砂糖です。

あまりにも曖昧なため、メソッドグループから正しいオーバーロードを解決できない場合は、長文の構文を使用するしかありません。例えば、それはMenuItem(string, Delegate)した場合、 - - それは、さもなければ曖昧であるかどう

+0

これは非常にうまくそれを要約します。 @keyboardPは、イベントハンドラの割り当て/割り当て解除の説明を使って答えに多くを追加します。 – DonBoitnott

9

古いバージョンのC#コンパイラ(< = 1.1)の構文です。もう必要ありません。現在のコンパイラは、それを正しく得るために洗練されています。

時には1つ(少し)の利点があります。イベントハンドラを "+ ="で割り当てた場合、Intellisenseのオートコンプリート機能によりコードを少し速く書くことができます。

+1

この構文は.Net 2.0では不要になりました。 – Gjeltema

+1

さて、訂正しました。ヒントをありがとう。 – JeffRSon

+1

-1を+1に切り替えました。 – Gjeltema

7

のみ時間、これは有用である複数等しく一致過負荷があった場合には、署名に一致しました。これはまた、var構文(以下に示す)とジェネリック型推論(図示せず)を含む。他の全ての場合において

EventHandler handler = SomeMethod; // fine 
EventHandler handler = new EventHandler(SomeMethod); // fine 
var handler = new EventHandler(SomeMethod); // fine 
var handler = (EventHandler)SomeMethod; // fine 
var handler = SomeMethod; // not fine 

を、それが冗長であり、以降2.0から任意のコンパイラでは不要です。あなたの編集に関連する

5

- ハンドラを追加することは、本当にnewかを使用することによって影響を受けるが、この

listView.ItemClick -= listView_ItemClick; 

listView.ItemClick -= new ItemClickEventHandler(listView_ItemClick); 

ようハンドラを削除に若干の違いがありますされていませんほとんどのシナリオに影響することはほとんどありません。 newキーワードのない最初のバージョンは、おそらくより効率的です。

ありthis postでの詳細な説明だが、結論は

そうな作品でもあるが、我々はどちらを使うべきでしょうか?イベントが のような一般的な WinFormアプリケーションのように、開始/終了時に1回購読/購読解除されている場合、それは重要ではありません。これは 複数回行われた場合、それは高価なヒープ割り当ての少ない を行い、高速

(そのポストに第二のアプローチは、newキーワードなし一つである)

を動作するようにしかし、第2のアプローチであることが好ましいです

私にとってはマイクロ最適化のように思えるので、大部分のケースではボトルネックになることはまずありません。

+1

最終的に、@ByteBlastはこの一般的な質問にかなりうまく答えましたが、この答えを追加するために+1して、それは非常に多くを提供します。 – DonBoitnott

関連する問題