2009-08-11 4 views
4

イベントに登録したいですか?以下のように動作します:次のイベントへの登録方法に違いがありますか?

public void AddOptionAsListner(OptionElement option) 
    { 
     option.Selected += onOptionSelectedChanged; 
    } 

public void AddOptionAsListner(OptionElement option) 
    { 
     option.Selected += new EventHandler(onOptionSelectedChanged); 
    } 

同じことについて違いがありますか、それとも全く違うのですか?

+0

これは詐欺です。 –

+0

違いはありません。 私の0.02c、イベントの登録を解除するときも同じです。 –

+2

@Mehrdad - あなたは少なくとも重複へのリンクを与える優しさがあります – Elad

答えて

9

同じ - 差分はありません。コンパイラはデリゲートの型を推測し、自動的にあなたのためにそれを行います。あなたの人生を少し楽にする文法的な砂糖

ちょうどC#の深さでチェックされています。この機能は「メソッドグループ変換」と呼ばれます。 C#2.0で追加

私は反射でこれを開く場合帳から

static void MyMethod() { ... } 
static void MyMethod(object sender, EventArgs e) {...} 

static void Main() { 
    ThreadStart x = MyMethod; // binds to first overload 
    EventHandler y = MyMethod; // binds to second overload 
} 

、あなたはもちろんの舞台裏、コンパイラはあなたのためだけに右のタイプのデリゲートのインスタンスを作成したことを参照してくださいね。

L_0000: ldnull 
    L_0001: ldftn void CS.Temp.Program::MyMethod() 
    L_0007: newobj instance void [mscorlib]System.Threading.ThreadStart::.ctor(object, native int) 
    L_000c: pop 
    L_000d: ldnull 
    L_000e: ldftn void CS.Temp.Program::MyMethod(object, class [mscorlib]System.EventArgs) 
    L_0014: newobj instance void [mscorlib]System.EventHandler::.ctor(object, native int) 
    L_0019: pop 
+0

後者は、私の記憶が役立つならば、1.1で必要だった古いシンタクスです。それとも2.0だったかもしれない。しかし今、コンパイラはそれ自身でトリックを行います。 –

+0

さて、あなたは..リファレンスブックでチェックバックしていました:) 2.0+コンパイラはメソッド/メソッドグループを適切なタイプのデリゲート – Gishu

3

同じことですが、新しいEventHandler()は冗長です。

イベントハンドラのデリゲートを明示的に作成する必要はありません。

+0

小さな違いは、c#1.0では第1のコンパイルがコンパイルされないことです。 –

+0

良い点ですが、その質問はC#3.0のタグが付けられていたので、私はそれを言及するとは思わなかった。 – Brandon

0

ランタイムに関する限り、違いはありません。コンパイラでは、とわずかにと見なされ、イベント自体のシグネチャに基づいてデリゲート(イベント処理メソッド)のシグネチャを推測する必要があり、2番目にシグネチャを指定する必要があります。

2番目の署名は、イベントに登録するときに「自動」(つまり、「タブ、タブ」シーケンス)を使用すると、Visual Studioによって自動的に生成されます。