記事ディレクトリ
15.1 パブリッシャーとサブスクライバー
パブリッシャー/サブスクライバー パターン: パブリッシャーは一連のイベントを定義し、サブスクライバーはパブリッシャーにメソッドを提供することで通知を「登録」できます。
イベントが発生すると、パブリッシャーは「イベントを起動」し、サブスクライバーによって送信されたすべてのメソッドを実行します。
- パブリッシャー: イベントの発生時に他のクラスに通知できるように、イベントを発行するクラスまたは構造体。
- サブスクライバー: イベントを登録し、イベントの発生時に通知されるクラスまたは構造体。
- イベントはプライベート デリゲートへの構造化されたアクセスを提供しますが、デリゲートに直接アクセスすることはできません。
- イベントは追加、削除、または呼び出しのみ可能です。
- イベントがトリガーされると、デリゲートが呼び出され、リスト内のメソッドが順番に実行されます。
15.2 ソースコードコンポーネントの概要
イベントで使用する必要があるコードは次の 5 つの部分で構成されます。
- デリゲート型の宣言。
- イベントハンドラーの宣言。
- イベントステートメント。
- イベント登録。
- イベントをトリガーするコード。
15.3 イベントの宣言
- イベントはクラス内で宣言されます。
- デリゲート型の名前が必要です。
- 外部サブスクライバーによるアクセスのためにパブリックとして宣言します。
- イベント オブジェクトは new を使用して作成できません。
イベントはタイプではなくメンバーです。
- イベントは、実行可能コードのブロック内で宣言できません。
- クラスまたは構造体で宣言する必要があります。
- イベント メンバーは暗黙的に自動的に null に初期化されます。
- BCL は、システム イベント専用に EventHandler という名前のデリゲートを宣言します。
15.4 イベントのサブスクライブ
+=
演算子を使用して、イベントのイベント ハンドラーを追加します。- イベント ハンドラーは次のいずれかになります。
- インスタンスメソッド。
- 静的メソッド。
- 匿名メソッド。
- ラムダ式。
15.5 イベントのトリガー
- イベントをトリガーする前に null と比較します。
- メソッドを呼び出すのと同じようにイベントを使用します。
次の例は、パブリッシャー Incrementer とサブスクライバー Dozens の使用を示しています。DoCount メソッドでは、カウントが 12 増加するたびに CountedADozen イベントがトリガーされます。
15.6 標準イベントの使用法
イベントは Windows GUI プログラミングで広く使用されており、EventHandler デリゲート型は次のように宣言されます。
- 最初のパラメータは、トリガーとなるイベント オブジェクトへの参照を保存するために使用されます。
- 2 番目のパラメータはステータス情報を保存するために使用されます。
- EventArgs はデータを渡すことができないため、通常は無視されます。
- データを渡す必要がある場合は、EventArgs を派生し、適切なフィールドを使用してデータを保存する必要があります。
- object と EventArgs は常に渡される引数の基本クラスであるため、すべてのイベントを処理するために使用できます。
15.6.1 EventArgs の拡張によるデータの受け渡し
次の情報クラスをカスタマイズします。クラス名は EventArgs で終わる必要があります。
カスタム情報クラスを使用するには、ジェネリックを持つデリゲートを使用します。
15.6.2 イベントハンドラの削除
イベント ハンドラを削除するには、-=
演算子を使用します。
デリゲートと同様に、ハンドラーがイベント内で複数回登録されている場合、削除時にリストの最後のハンドラーのみが削除されます。
15.7 イベント アクセサ
add
および remove
アクセサーを使用して、 +=
および -=
を変更します。操作キャラクターの動作。
- イベント アクセサーの宣言は、プロパティの宣言と似ています。
- イベント アクセサーを宣言した後、イベントにはインライン デリゲートが含まれないため、イベントを保存および削除するメソッドを自分で実装する必要があります。
- イベント アクセサーには戻り値がなく、void メソッドです。