最終更新:2015-09-22 (火) 01:34:41 (3110d)
C♯/event
https://msdn.microsoft.com/ja-jp/library/8627sbea.aspx
概要
- プロパティのデリゲート版。
- クラス内部からは通常のデリゲート変数と同様に扱え、 外部からは +=、-= 演算子によるデリゲートの追加/削除のみを行えるような仕組み
デリゲート型のプロパティでは不十分な点
- デリゲート呼び出しはクラス内部からのみ可能。
- 外部からはデリゲートの追加/削除のみが可能。
eventをつけると
event デリゲート型 イベント ハンドラー名;
- 内部からは普通のデリゲートと同じように利用できる
- 外部からは +=、-= のみが利用できるようになります。
定義
class HogeClass { //デリゲートを宣言 //Declare the delegate (if using non-generic pattern). public delegate void SampleEventHandler(object sender, SampleEventArgs): //イベントを宣言 // Declare the event. //public event デリゲート型 イベント; public event SampleEventHandler SampleEvent; }
- イベントハンドラはdelegate型
- イベントハンドラは〜EventHandlerという名前
呼び出し
SampleEvent(this, new SampleEventArgs("Hoge"));
派生クラスから
- 他のクラスの基本クラスとして使用できるクラスを作成するときは、イベントは宣言元のクラスからしか呼び出せない特別なデリゲートであることを考慮する必要があります。
- 派生クラスは、基本クラスの中で宣言されたイベントを直接呼び出せません。
- 常に基本クラスからイベントを発生させるようにしたい場合もありますが、ほとんどの場合、派生クラスから基本クラス イベントを発生させることができるようにします。
- このためには、イベントをラップする基本クラス内に保護された呼び出しメソッドを作成します。 この起動メソッドを呼び出すかオーバーライドすることによって、派生クラスから間接的にイベントを呼び出せます。
- https://msdn.microsoft.com/ja-jp/library/hy3sefw3.aspx
ジェネリックバージョン
- デリゲートEventHandler<TEventArgs>の定義
[SerializableAttribute] public delegate void EventHandler<TEventArgs>( Object sender, TEventArgs e ) where TEventArgs : EventArgs
- 例
class HogeClass { //EventHandler<T>を使ってイベントを宣言 //public event デリゲート型 イベント; public event EventHandler<CustomEventArgs> RaiseCustomEvent; }
eventキーワード
- イベント処理には、単なるデリゲート型のプロパティでは機能が不十分
- 呼び出しはクラス内からのみ
- 外部からできるのは登録・削除のみ
- という制約が必要。
- クラス内部からは通常のデリゲート変数と同様に扱え、 外部からは +=、-= 演算子によるデリゲートの追加/削除のみを行える