event (C# リファレンス)
イベントは、オブジェクトが通知をトリガーできるようにするメンバーです。 イベント ユーザーは、イベント ハンドラーを用意することで、イベントに実行可能コードをアタッチできます。 イベントは、event
キーワードを使用して宣言します。 イベントはデリゲート型です。 オブジェクトがイベントをトリガーすると、そのイベントは、用意されたすべてのイベント ハンドラーを呼び出します。 イベントハンドラーは、イベントに追加され、イベントが発生したときに実行されるデリゲート インスタンスです。 イベント ユーザーは、イベントに対してイベント ハンドラーを追加または削除できます。
例
次の例では、基になるデリゲート型として EventHandler を使用するイベントを宣言し、発生させる方法について説明します。 完全なコード例については、「.NET ガイドラインに準拠したイベントを発行する方法」を参照してください。この例では、ジェネリック EventHandler<TEventArgs> デリゲート型を使用する方法と、イベントをサブスクライブして、イベント ハンドラー メソッドを作成する方法も確認できます。
public class SampleEventArgs
{
public SampleEventArgs(string text) { Text = text; }
public string Text { get; } // readonly
}
public class Publisher
{
// Declare the delegate (if using non-generic pattern).
public delegate void SampleEventHandler(object sender, SampleEventArgs e);
// Declare the event.
public event SampleEventHandler SampleEvent;
// Wrap the event in a protected virtual method
// to enable derived classes to raise the event.
protected virtual void RaiseSampleEvent()
{
// Raise the event in a thread-safe manner using the ?. operator.
SampleEvent?.Invoke(this, new SampleEventArgs("Hello"));
}
}
イベントは、宣言元 (パブリッシャー クラス) のクラス (または派生クラス)、あるいは構造体内でしか呼び出せない特殊なマルチキャスト デリゲートです。 他のクラスまたは構造体がイベントを受信登録した場合、パブリッシャー クラスがイベントを発生させると、他のクラスまたは構造体のイベント ハンドラー メソッドが呼び出されます。 詳細およびコード例については、「イベント」および「デリゲート」を参照してください。
イベントは、public、private、protected、internal、protected internal、または private protected としてマークできます。 これらのアクセス修飾子により、クラスのユーザーがイベントにアクセスする方法が定義されます。 詳細については、「アクセス修飾子」を参照してください。
キーワードとイベント
イベントには次のキーワードが適用されます。
キーワード | 説明 | 詳細情報 |
---|---|---|
static | クラスのインスタンスが存在しない場合でも、呼び出し元がいつでもイベントを使用できるようになります。 | 静的クラスと静的クラス メンバー |
virtual | override キーワードを使用してイベントの動作をオーバーライドすることを派生クラスに許可します。 | 継承 |
sealed | 派生クラスでは、それが仮想ではなくなったことを指定します。 | |
abstract | コンパイラはイベント アクセサー ブロックの add と remove を生成しません。したがって、派生クラスは固有の実装を提供する必要があります。 |
イベントは、static キーワードを使用して静的イベントとして宣言されることもあります。 その場合、クラスのインスタンスが存在しなくても、呼び出し元がいつでもイベントを使用できるようになります。 詳細については、「静的クラスと静的クラス メンバー」を参照してください。
イベントは、virtual キーワードを使用して仮想イベントとしてマークできます。 その場合、派生クラスでは、override キーワードを使用してイベントの動作をオーバーライドできます。 詳細については、「継承」を参照してください。 仮想イベントをオーバーライドするイベントは、sealed にすることもできます。その場合、派生クラスでは、イベントが仮想でなくなります。 最後に、イベントは abstract として宣言できます。その場合、コンパイラはイベント アクセサー ブロックの add
と remove
を生成しません。 したがって、派生クラスごとに固有の実装を提供する必要があります。
C# 言語仕様
詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
関連項目
.NET