イベント

概要

任意インスタンスからのイベント発行を、他インスタンスで購読し、それをトリガーに処理を動かすことができます。

イベントの定義

eventキーワードを用いて定義します。

public event EventHandler HogeEvent;

eventキーワードとともに指定する型はデリゲート型である必要があります。
Actionなども指定可能ですが、イベントに特化したデリゲート型であるEventHandler/EventHandlerを主に使用します。

eventキーワードを付与することで、以下の成約が生まれます。

  • デリゲート実行は定義しているクラス内からしかできない
// コンパイルエラー
hoge.HogeEvent.Invoke();
  • 外部クラスからはデリゲートへの処理の登録・解除しかできない
// OK
hoge.HogeEvent += HandleHoge;
hoge.HogeEvent -= HandleHoge;

// コンパイルエラー
hoge.HogeEvent = null;

イベントの登録・実行

上記の通り、イベントのデリゲートに対して「+=」「-=」で処理の登録・解除ができます。
定義クラス内でイベントを実行することで、登録された処理が実行されます。

public sealed class Publisher
{
    public event EventHandler TestEvent;

    public void RaiseTestEvent()
    {
        TestEvent?.Invoke(this, EventArgs.Empty);
    }
}

public static void Main()
{
    var publisher = new Publisher();
    publisher.TestEvent += (sender, e) => Console.WriteLine("TestEvent Published");

    publisher.RaiseTestEvent();
}

補足

イベントの仕組みは、外部にデリゲート型のフィールド・プロパティを公開するだけで実現はできます。
ただし、外部からクリアされる可能性や、イベントと関係なくデリゲートが実行される可能性があります。