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"));
    }
}

イベントは、宣言元 (パブリッシャー クラス) のクラス (または派生クラス)、あるいは構造体内でしか呼び出せない特殊なマルチキャスト デリゲートです。 他のクラスまたは構造体がイベントを受信登録した場合、パブリッシャー クラスがイベントを発生させると、他のクラスまたは構造体のイベント ハンドラー メソッドが呼び出されます。 詳細およびコード例については、「イベント」および「デリゲート」を参照してください。

イベントは、publicprivateprotectedinternalprotected internal、または private protected としてマークできます。 これらのアクセス修飾子により、クラスのユーザーがイベントにアクセスする方法が定義されます。 詳細については、「アクセス修飾子」を参照してください。

キーワードとイベント

イベントには次のキーワードが適用されます。

キーワード 説明 詳細情報
static クラスのインスタンスが存在しない場合でも、呼び出し元がいつでもイベントを使用できるようになります。 静的クラスと静的クラス メンバー
virtual override キーワードを使用してイベントの動作をオーバーライドすることを派生クラスに許可します。 継承
sealed 派生クラスでは、それが仮想ではなくなったことを指定します。
abstract コンパイラはイベント アクセサー ブロックの addremove を生成しません。したがって、派生クラスは固有の実装を提供する必要があります。

イベントは、static キーワードを使用して静的イベントとして宣言されることもあります。 その場合、クラスのインスタンスが存在しなくても、呼び出し元がいつでもイベントを使用できるようになります。 詳細については、「静的クラスと静的クラス メンバー」を参照してください。

イベントは、virtual キーワードを使用して仮想イベントとしてマークできます。 その場合、派生クラスでは、override キーワードを使用してイベントの動作をオーバーライドできます。 詳細については、「継承」を参照してください。 仮想イベントをオーバーライドするイベントは、sealed にすることもできます。その場合、派生クラスでは、イベントが仮想でなくなります。 最後に、イベントは abstract として宣言できます。その場合、コンパイラはイベント アクセサー ブロックの addremove を生成しません。 したがって、派生クラスごとに固有の実装を提供する必要があります。

C# 言語仕様

詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

関連項目