C# 図解チュートリアル 第 5 版 - 第 15 章 イベント

15.1 パブリッシャーとサブスクライバー

パブリッシャー/サブスクライバー パターン: パブリッシャーは一連のイベントを定義し、サブスクライバーはパブリッシャーにメソッドを提供することで通知を「登録」できます。

イベントが発生すると、パブリッシャーは「イベントを起動」し、サブスクライバーによって送信されたすべてのメソッドを実行します。

画像-20231103180517931
図15.1 パブリッシャーとサブスクライバー
  • パブリッシャー: イベントの発生時に他のクラスに通知できるように、イベントを発行するクラスまたは構造体。
  • サブスクライバー: イベントを登録し、イベントの発生時に通知されるクラスまたは構造体。
画像-20231103180753626
図 15.2 イベントにはカプセル化されたデリゲートが含まれています
  • イベントはプライベート デリゲートへの構造化されたアクセスを提供しますが、デリゲートに直接アクセスすることはできません。
  • イベントは追加、削除、または呼び出しのみ可能です。
  • イベントがトリガーされると、デリゲートが呼び出され、リスト内のメソッドが順番に実行されます。
画像-20231103181031956
図 15.3 イベントを伴うクラス構造と用語

15.2 ソースコードコンポーネントの概要

イベントで使用する必要があるコードは次の 5 つの部分で構成されます。

  1. デリゲート型の宣言。
  2. イベントハンドラーの宣言。
  3. イベントステートメント。
  4. イベント登録。
  5. イベントをトリガーするコード。
画像-20231103181440334
図 15.4 イベントを使用する場合の 5 つのソース コード コンポーネント

15.3 イベントの宣言

  • イベントはクラス内で宣言されます。
  • デリゲート型の名前が必要です。
  • 外部サブスクライバーによるアクセスのためにパブリックとして宣言します。
  • イベント オブジェクトは new を使用して作成できません。
画像-20231103181639903
図15.5 イベントの宣言

イベントはタイプではなくメンバーです。

  1. イベントは、実行可能コードのブロック内で宣言できません。
  2. クラスまたは構造体で宣言する必要があります。
  3. イベント メンバーは暗黙的に自動的に null に初期化されます。
  4. BCL は、システム イベント専用に EventHandler という名前のデリゲートを宣言します。

15.4 イベントのサブスクライブ

  • += 演算子を使用して、イベントのイベント ハンドラーを追加します。
  • イベント ハンドラーは次のいずれかになります。
    • インスタンスメソッド。
    • 静的メソッド。
    • 匿名メソッド。
    • ラムダ式。
画像-20231103182013844 画像-20231103182116181
図15.6 イベントのサブスクライブ方法

15.5 イベントのトリガー

  • イベントをトリガーする前に null と比較します。
  • メソッドを呼び出すのと同じようにイベントを使用します。
画像-20231103182555769
図15.7 トリガーイベント

次の例は、パブリッシャー Incrementer とサブスクライバー Dozens の使用を示しています。DoCount メソッドでは、カウントが 12 増加するたびに CountedADozen イベントがトリガーされます。

画像-20231103182745213 画像-20231103182826555
図 15.8 イベントを使用するために必要な 5 つの部分を示すパブリッシャーとサブスクライバーを含む完全なプログラム

15.6 標準イベントの使用法

イベントは Windows GUI プログラミングで広く使用されており、EventHandler デリゲート型は次のように宣言されます。

画像-20231103183104166
図15.9 EventHandlerデリゲート型宣言
  • 最初のパラメータは、トリガーとなるイベント オブジェクトへの参照を保存するために使用されます。
  • 2 番目のパラメータはステータス情報を保存するために使用されます。
  • EventArgs はデータを渡すことができないため、通常は無視されます。
  • データを渡す必要がある場合は、EventArgs を派生し、適切なフィールドを使用してデータを保存する必要があります。
  • object と EventArgs は常に渡される引数の基本クラスであるため、すべてのイベントを処理するために使用できます。

15.6.1 EventArgs の拡張によるデータの受け渡し

次の情報クラスをカスタマイズします。クラス名は EventArgs で終わる必要があります。

画像-20231103183843250 画像-20231103183828505
図15.10 カスタム情報クラス

カスタム情報クラスを使用するには、ジェネリックを持つデリゲートを使用します。

画像-20231103184021031 画像-20231103184201741
図15.11 カスタム情報クラスを使用するための汎用デリゲートの使用

15.6.2 イベントハンドラの削除

イベント ハンドラを削除するには、-= 演算子を使用します。

デリゲートと同様に、ハンドラーがイベント内で複数回登録されている場合、削除時にリストの最後のハンドラーのみが削除されます。

15.7 イベント アクセサ

add および remove アクセサーを使用して、 += および -= を変更します。操作キャラクターの動作。

  • イベント アクセサーの宣言は、プロパティの宣言と似ています。
  • イベント アクセサーを宣言した後、イベントにはインライン デリゲートが含まれないため、イベントを保存および削除するメソッドを自分で実装する必要があります。
  • イベント アクセサーには戻り値がなく、void メソッドです。
画像-20231103184600692
図15.12 イベントアクセサ

おすすめ

転載: blog.csdn.net/zheliku/article/details/134453087