イベントは、オブジェクトが通知をトリガーできるようにするメンバーです。 イベント ユーザーは、イベント ハンドラーを用意することで、イベントに実行可能コードをアタッチできます。
event
は、 キーワードを使用して宣言します。 イベントはデリゲート型です。 オブジェクトがイベントをトリガーすると、そのイベントは、用意されたすべてのイベント ハンドラーを呼び出します。 イベントハンドラーは、イベントに追加され、イベントが発生したときに実行されるデリゲート インスタンスです。 イベント ユーザーは、イベントに対してイベント ハンドラーを追加または削除できます。
C# 言語リファレンスには、C# 言語の最新リリース バージョンが記載されています。 また、今後の言語リリースのパブリック プレビューの機能に関する初期ドキュメントも含まれています。
このドキュメントでは、言語の最後の 3 つのバージョンまたは現在のパブリック プレビューで最初に導入された機能を特定します。
ヒント
C# で機能が初めて導入された時期を確認するには、 C# 言語バージョン履歴に関する記事を参照してください。
次の例では、基になるデリゲート型として 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イベント アクセサー ブロックを生成しないため、派生クラスは独自の実装を提供する必要があります。
static キーワードを使用して、静的イベントとしてイベントを宣言します。 静的イベントは、クラスのインスタンスが存在しない場合でも、いつでも呼び出し元が使用できます。 詳細については、「静的クラスと静的クラス メンバー」を参照してください。
virtual キーワードを使用して、イベントを仮想イベントとしてマークします。 派生クラスは、 override キーワードを使用してイベントの動作をオーバーライドできます。 詳細については、「継承」を参照してください。 仮想イベントをオーバーライドするイベントを sealedすることもできます。このイベントは、派生クラスの場合は仮想でなくなったことを指定します。 最後に、イベントは abstract宣言できます。つまり、コンパイラは add と remove イベント アクセサー ブロックを生成しません。 そのため、派生クラスは独自の実装を提供する必要があります。
C# 言語仕様
詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
関連項目
.NET