イベントは、オブジェクトが通知をトリガーできるようにするメンバーです。 イベント ユーザーは、イベント ハンドラーを用意することで、イベントに実行可能コードをアタッチできます。
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
としてマークできます。 これらのアクセス修飾子により、クラスのユーザーがイベントにアクセスする方法が定義されます。 詳細については、「アクセス修飾子」を参照してください。
C# 14 以降では、イベントを partial
できます。 部分イベントには、1 つの定義宣言と 1 つの実装宣言があります。 定義宣言では、フィールドに似た構文を使用する必要があります。 実装宣言では、 add
ハンドラーと remove
ハンドラーを宣言する必要があります。
キーワードとイベント
イベントには次のキーワードが適用されます。
キーワード | 説明 | 詳細情報 |
---|---|---|
static |
クラスのインスタンスが存在しない場合でも、呼び出し元がいつでもイベントを使用できるようになります。 | 静的クラスと静的クラス メンバー |
virtual |
override キーワードを使用してイベントの動作をオーバーライドすることを派生クラスに許可します。 | 継承 |
sealed |
派生クラスに対して、それが仮想でなくなったことを指定します。 | |
abstract |
コンパイラは add と remove イベント アクセサー ブロックを生成しないため、派生クラスは独自の実装を提供する必要があります。 |
静的 キーワードを 使用して、静的イベントとしてイベントを宣言できます。 静的イベントは、クラスのインスタンスが存在しない場合でも、いつでも呼び出し元が使用できます。 詳細については、「静的クラスと静的クラス メンバー」を参照してください。
virtual
キーワードを使用して、イベントを仮想イベントとしてマークできます。 派生クラスは、 override
キーワードを使用してイベントの動作をオーバーライドできます。 詳細については、「継承」を参照してください。 仮想イベントをオーバーライドするイベントを sealed
することもできます。このイベントは、派生クラスの場合は仮想でなくなったことを指定します。 最後に、イベントは abstract
宣言できます。つまり、コンパイラは add
と remove
イベント アクセサー ブロックを生成しません。 したがって、派生クラスごとに固有の実装を提供する必要があります。
C# 言語仕様
詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
関連項目
.NET