注
このコンテンツは、 フレームワーク設計ガイドライン (再利用可能な .NET ライブラリの規則、イディオム、パターン、第 2 版) から、Pearson Education, Inc. のアクセス許可によって再印刷されます。 そのエディションは2008年に出版され、その後 、本は第3版で完全に改訂されています。 このページの情報の一部が古くなっている可能性があります。
イベントは、最も一般的に使用されるコールバックの形式です (フレームワークがユーザー コードを呼び出せるようにするコンストラクト)。 その他のコールバック メカニズムには、デリゲートを受け取るメンバー、仮想メンバー、インターフェイス ベースのプラグインなどがあります。ユーザビリティ調査のデータは、開発者の大半が、他のコールバック メカニズムを使用するよりも、イベントの使用に慣れていることを示しています。 イベントは、Visual Studio や多くの言語とうまく統合されています。
イベントには、システムの状態が変化する前に発生するイベント (プリイベントと呼ばれます) と、状態が変化した後に発生するイベント (事後イベント) の 2 つのグループがあることに注意してください。 事前イベントの例として、フォームを閉じる前に発生する Form.Closing
があります。 ポスト イベントの例として、フォームを閉じた後に発生する Form.Closed
があります。
✔️ イベントの場合は、"起動 (fire)" や "トリガー (trigger)" ではなく、"発生 (raise)" という用語を使用します。
✔️ イベント ハンドラーとして使用する新しいデリゲートを手動で作成する代わりに、 System.EventHandler<TEventArgs> を使用してください。
✔️ イベントがイベント処理メソッドにデータを運ぶ必要が絶対に確実でない限り、イベント引数として EventArgs のサブクラスを使用することを検討してください。その場合は、 EventArgs
型を直接使用できます。
EventArgs
を直接使用して API を出荷する場合、互換性を損なうことなく、イベントに含まれるデータを追加することはできません。 サブクラスを使用する場合、最初は完全に空であっても、必要に応じてサブクラスにプロパティを追加できます。
✔️ 保護された仮想メソッドを使用して各イベントを発生させます。 これは、シールされていないクラスの非静的イベントにのみ適用され、構造体、シール クラス、静的イベントには適用されません。
メソッドの目的は、派生クラスがオーバーライドを使用してイベントを処理する方法を提供することです。 オーバーライドは、派生クラスの基底クラス イベントを処理する、より柔軟で高速で自然な方法です。 慣例により、メソッドの名前は "On" で始まり、その後にイベントの名前を付ける必要があります。
派生クラスは、オーバーライドでメソッドの基本実装を呼び出さない場合があります。 そのためには、基底クラスが正しく動作するために必要な処理をメソッドに含めないようにします。
✔️ イベントを発生させる保護されたメソッドに対して 1 つのパラメーターを受け取ります。
パラメーターには e
という名前を付け、イベント引数クラスとして型指定する必要があります。
❌ 非静的イベントを発生させるときに、送信者として null を渡さないでください。
✔️ 静的イベントを発生させるときに、送信者として null を渡します。
❌ イベントを発生させるときに、イベント データ パラメーターとして null を渡さないでください。
イベント処理メソッドにデータを渡さない場合は、 EventArgs.Empty
を渡す必要があります。 開発者は、このパラメーターが null ではないことを期待しています。
✔️ エンド ユーザーが取り消すことができるイベントの発生を検討してください。 これは、事前イベントにのみ適用されます。
エンド ユーザーがイベントを取り消せるようにするには、イベント引数として System.ComponentModel.CancelEventArgs またはそのサブクラスを使用します。
カスタム イベント ハンドラーの設計
フレームワークが以前のバージョンの CLR (ジェネリックをサポートしていない) で動作する必要がある場合など、 EventHandler<T>
を使用できない場合があります。 このような場合は、カスタム イベント ハンドラー デリゲートの設計と開発が必要になる場合があります。
✔️ イベント ハンドラーには void 戻り値を使用してください。
イベント ハンドラーは、複数のオブジェクトで複数のイベント処理メソッドを呼び出すことができます。 イベント処理メソッドが値を返す場合、イベント呼び出しごとに複数の戻り値が存在します。
✔️ イベント ハンドラーの最初のパラメーターの型として object
を使用し、 sender
呼び出します。
✔️ イベント ハンドラーの 2 番目のパラメーターの型として System.EventArgs またはそのサブクラスを使用し、 e
呼び出します。
❌ イベント ハンドラーに 2 つ以上のパラメーターを指定しないでください。
Portions © 2005, 2009 Microsoft Corporation. 無断転載を禁じます。
フレームワーク設計ガイドライン:再利用可能な .NET ライブラリの規則、イディオム、パターン、Krzysztof Cwalina および Brad Abrams による第 2 版は、2008 年 10 月 22 日に Microsoft Windows 開発シリーズの一部として Addison-Wesley Professional によって公開されました。