イベントのデザイン

更新 : 2007 年 11 月

イベントは、アクションが発生したときにアプリケーション固有のコードを実行できるようにする機構です。イベントには、関連するアクションの発生前に発生するもの (前イベント) とアクションの発生後に発生するもの (後イベント) があります。たとえば、ユーザーがウィンドウのボタンをクリックすると、後イベントが発生し、アプリケーション固有のメソッドの実行が可能になります。イベント ハンドラ デリゲートは、システムによってイベントが発生したときに実行されるメソッドにバインドします。イベント ハンドラをイベントに追加し、イベントの発生時にメソッドを呼び出すことができるようにします。イベントには、イベント固有データを割り当てることができます。たとえば、マウス ダウン イベントには、画面上のカーソル位置に関するデータを含めることができます。

イベント処理メソッドのシグネチャは、イベント ハンドラ デリゲートのシグネチャと同じです。イベント ハンドラ シグネチャは、以下の規則に従います。

  • 戻り値の型は Void です。

  • 1 つ目のパラメータは、sender という名前の Object 型です。これは、イベントを発生させたオブジェクトです。

  • 2 つ目のパラメータは、e という名前の EventArgs 型または EventArgs の派生クラスです。これは、イベント固有データです。

  • メソッドは、これら 2 つのパラメータだけを受け取ります。

イベントの詳細については、「イベントの処理と発生」を参照してください。

イベント ハンドラとして使用する新しいデリゲートを手動で作成する代わりに、System.EventHandler<T> を使用してください。

このガイドラインは、主に新しい機能領域に適用されます。既に非ジェネリック イベント ハンドラを使用している領域で機能を拡張する場合は、非ジェネリック イベント ハンドラの使用を継続して、デザインの一貫性を維持できます。

ライブラリが対象とする .NET Framework のバージョンがジェネリックをサポートしていない場合は、このガイドラインに従うことができません。

イベント引数として System.EventArgs の派生クラスを使用することを検討してください。ただし、イベントによってデータをイベント処理メソッドに搬送する必要がないことが確実な場合は、System.EventArgs 型を直接使用できます。

定義した派生クラスの代わりに EventArgs インスタンスを受け取るイベントを定義した場合は、その後のバージョンではデータをイベントに追加できなくなります。そのため、EventArgs の空の派生クラスを作成することをお勧めします。これにより、互換性に影響する変更点を導入せずに、その後のバージョンでイベントにデータを追加できるようになります。

プロテクト仮想メソッドを使用して、各イベントを発生させてください。これは、シールされていないクラスの非静的イベントだけに適合し、構造体、シール クラス、および静的イベントには適合しません。

このガイドラインに従うと、プロテクト メソッドをオーバーライドすることにより派生クラスで基本クラス イベントを処理できます。プロテクト virtual (Visual Basic の場合は Overridable) メソッドの名前はイベント名と同じにし、名前の先頭に On を付ける必要があります。たとえば、"TimeChanged" という名前のイベントのプロテクト仮想メソッドには、"OnTimeChanged" という名前を付けます。

ms229011.alert_caution(ja-jp,VS.90).gif重要 :

プロテクト仮想メソッドをオーバーライドする派生クラスは、基本クラス実装の呼び出しには必要ありません。基本クラスは、その実装が呼び出された場合でも正しく動作し続ける必要があります。

イベントを発生させるプロテクト メソッドには、イベント引数クラスとして型指定されたパラメータを使用してください。このパラメータには、e という名前を付ける必要があります。

FontDialog クラスは、Apply イベントを発生させる次のメソッドを提供します。

Protected Overridable Sub OnApply( ByVal e As EventArgs )
protected virtual void OnApply(EventArgs e);

非静的イベントを発生させるときは、sender パラメータとして null (Visual Basic の場合は Nothing) を渡さないでください。

静的イベントでは、sender パラメータは、null (Visual Basic の場合は Nothing) にする必要があります。

イベントを発生させるときは、イベント データ パラメータとして null (Visual Basic の場合は Nothing) を渡さないでください。

イベント データが存在しない場合は、null の代わりに Empty を渡します。

イベント処理メソッドで任意のコードを実行できるようにしてください。

イベント ハンドラから処理できない例外がスローされた場合にプログラムが終了しないようにするために、イベントが発生するコードは、try-catch ブロックに配置するようにしてください。

エンド ユーザーがキャンセルできるイベントを発生させることを検討してください。これは、前イベントだけに当てはまります。

キャンセル可能なイベントをデザインする場合は、e イベント データ オブジェクトの基本クラスとして、EventArgs の代わりに CancelEventArgs を使用してください。

Portions Copyright 2005 Microsoft Corporation.All rights reserved.

Portions Copyright Addison-Wesley Corporation.All rights reserved.

デザイン ガイドラインの詳細については、2005 年に Addison-Wesley から出版されている Krzysztof Cwalina、Brad Abrams 共著の『Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries』を参照してください。

参照

概念

カスタム イベント ハンドラのデザイン

その他の技術情報

メンバのデザインのガイドライン

クラス ライブラリ開発のデザイン ガイドライン