イベントとデリゲート
更新 : 2007 年 11 月
イベントは、アクションの発生を知らせるために、オブジェクトによって送信されるメッセージです。アクションは、ユーザーがマウスのクリックなどの対話的操作を行った場合や、なんらかのプログラム ロジックによってトリガされた場合などに発生します。イベントを発生させるオブジェクトをイベントの送信元と呼びます。イベントをキャプチャし、そのイベントに応答するオブジェクトをイベントの受信側と呼びます。
イベント通信では、イベント送信元のクラスは、発生させたイベントをどのオブジェクトまたはメソッドが受信する (処理する) かについての情報を持っていません。そこで、送信元と受信元との間を仲介するもの (つまりポインタ的な機構) が必要になります。.NET Framework では、関数ポインタの機能を提供する特別な型 (Delegate) が定義されています。
デリゲートは、メソッドへの参照を保持できるクラスです。他のクラスとは違って、デリゲート クラスはシグネチャを持ち、このシグネチャに一致するメソッドへの参照だけを保持できます。これにより、デリゲートはタイプ セーフな関数ポインタやコールバックと同等の機能を持つことができます。デリゲートにはさまざまな用途がありますが、ここではデリゲートのイベント処理機能について説明します。デリゲート クラスは、宣言すると、定義は不要です。デリゲート宣言によってデリゲートのシグネチャが与えられ、共通言語ランタイムによって実装が提供されます。次の例は、イベント デリゲート宣言です。
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
この構文は、メソッド宣言の構文と同様ですが、delegate キーワードによって、AlarmEventHandler がデリゲート型であることをコンパイラに通知しています。規約により、.NET Framework のイベント デリゲートは、そのイベントの発生元と、そのイベントのデータという 2 つのパラメータを持ちます。
AlarmEventHandler デリゲートのインスタンスは、シグネチャと一致する任意のメソッドに関連付けることができます。WakeMeUp クラスの AlarmRang メソッドに関連付ける例を次に示します。
public class WakeMeUp
{
// AlarmRang has the same signature as AlarmEventHandler.
public void AlarmRang(object sender, AlarmEventArgs e)
{...};
...
}
Public Class WakeMeUp
' AlarmRang has the same signature as AlarmEventHandler.
Public Sub AlarmRang(sender As Object, e As AlarmEventArgs)
...
End Sub
...
End Class
カスタム イベント デリゲートは、イベントがイベント データを生成する場合にだけ必要です。マウスのクリックなどのユーザー インターフェイス イベントの一部を含め、多くのイベントはイベント データを生成しません。イベントがデータを生成しない場合には、データなしイベント用のクラス ライブラリに用意されているイベント デリゲートの System.EventHandler が適しています。その宣言を次に示します。
delegate void EventHandler(object sender, EventArgs e);
Public Delegate Sub EventHandler(sender As Object, e As EventArgs)
イベント デリゲートはマルチキャストなので、複数のイベント処理メソッドへの参照を保持できます。詳細については、「Delegate」を参照してください。デリゲートでは、イベント処理を柔軟に、そして詳細に制御できます。デリゲートは、イベントに対して登録されているイベント ハンドラのリストを管理することで、そのイベントを発生させるクラスのイベント ディスパッチャとして動作します。
デリゲートを使ってコンポーネントやコントロールにイベント機能を実装する方法の詳細については、「イベントの発生」を参照してください。
アプリケーションでイベントを利用する方法の概要については、「イベントの利用」を参照してください。