2009-08-26 8 views

答えて

3

すべてのイベントは、Delegateを継承するMulticastDelegateから継承するEventHandlerから継承します。ときどき(または私はむしろほとんどの時間を言うでしょう)独自のカスタムデリゲートイベントを宣言する必要はありません。既存のデリゲートは、イベントのシグネチャと一致する限り使用できます。 .NET Framework 2.0にEventHandler<T>が導入されたことで、カスタムイベントデリゲートの必要性はほとんどなくなりました(フレームワークのイベント設計に従う限り)。だから、やって次

// declare an event with a custom delegate type 
public delegate void MyCustomEventHandler(object sender, EventArgs e); 
public event MyCustomEventHandler SomeCustomEvent; 

が...これと同等です:

// declare an event with an existing delegate type 
public event EventHandler SomeCustomEvent; 

あなたはいくつかのカスタムEventArgsクラスは、あなたの代わりにあなたのイベントのための一般的なEventHandler<T>を使用することができている必要があります

class MyCustomEventArgs : EventArgs 
{ 
    // you custom stuff here 
} 

public event EventHandler<MyCustomEventArgs> SomeCustomEvent; 
+0

ありがとうございました – markiz

+0

おっと、私はあなたの間違いでupvotedバックアップを投票しました。 –

1

他の誰か(あなたのasp.netページやいくつかのasp.net Webコントロール)によって作成されたイベントに登録している場合は、代理人を指定する必要はありません。デリゲートの署名と一致するメソッドを提供するだけです。

イベントを作成する担当者が代理人を提供する必要があります。加入者は方法を提供するだけである。

ASP.NETは、ページの定義内でAutoEventWireup="true"を指定した場合、コンパイル時にイベントを「結びつける」ため、混乱を招きます。

+0

2番目の例では、イベントはカスタムです(コントロールによって作成されたものではありません)。また、デリゲートを作成しませんでした。 – markiz

+2

これは組み込みのデリゲートです。http://msdn.microsoft.com/en-us/library/system.eventhandler(VS.71).aspx汎用のEventHandlerもあります。http://msdn.microsoft.com/en -us/library/db0etb8x.aspx –

+0

BCLで多数の代理人が利用可能です。 FuncとActionは私のお気に入りです。 – Will

1

.NETのイベントはデリゲートで実装されています。あなたの最初のリンクのページから :

イベントが にクラスのオブジェクトを可能にしますが、彼らがおそらく がに反応しなければならないことが起こった 何か他のオブジェクトに通知します。 [.NET]のイベントは、パブリッシャー/サブスクライバーモデルの に基づいています。イベントを実装するクラス は、そのイベントのパブリッシャと呼ばれる です。 サブスクライバークラスは パブリッシュされたイベントに の適切なイベントハンドラーを登録して、サブスクライブすることができます。

...

デリゲート型は がイベントに登録することができるイベントハンドラの 署名を決定します。

したがって、パブリッシングクラスは、サブスクライブするクラスが実装する必要があるデリゲートを定義します。イベントが発生すると、サブスクライブするクラスのメソッドがデリゲートを介して呼び出されます。また、イベントを処理するメソッドをイベントハンドラと呼びます。イベントは、イベントを公開するクラスのプロパティです。 イベントは、パブリッシュ/サブスクライブのイディオムを維持するように設計されています。