イベント
概要
任意インスタンスからのイベント発行を、他インスタンスで購読し、それをトリガーに処理を動かすことができます。
イベントの定義
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(); }
補足
イベントの仕組みは、外部にデリゲート型のフィールド・プロパティを公開するだけで実現はできます。
ただし、外部からクリアされる可能性や、イベントと関係なくデリゲートが実行される可能性があります。