イベント
最終更新:
atachi
eventキーワードがつけられたデリゲートインスタンスメンバはイベント専用のデリゲートとなり、いくつかの制約が追加される。
- デリゲートの呼び出しは、クラス内からのみ可能(それ以外のアクセスはコンパイルエラー)
- 呼び出しリストへの追加・削除が外部から可能
- addアクセッサ・removeアクセッサが使用可能
addアクセッサとremoveアクセッサはそれぞれデリゲートの呼び出しリストへの追加と削除に対応し、それぞれのタイミングで任意の処理を追加できる。
/**
* イベントハンドラのシグネチャを定義
*/
delegate void MyEventHandler();
class MyClass {
public event MyEventHandler MyEvent {
add {
// addアクセッサの処理
// 追加されようとしている値は、valueという名前でアクセスが可能
}
remove {
// removeアクセッサの処理
// 削除されようとしている値は、valueという名前でアクセスが可能
}
}
/**
* MyEventイベントの実行関数
*/
public void onMyEventHandler() {
Console.Write("onMyEventHandler");
}
/**
* エントリポイント
*/
static void Main(string[] args) {
MyClass obj = new MyClass();
obj.MyEvent += new MyEventHandler(obj.onMyEventHandler);
// イベントの実行(Main()はクラス内なのでMyEventを使用してイベントを発行できる)
obj.MyEvent(); // fire!
}
}
匿名メソッドを実行関数とした場合のリスナ解放はできません。
イベントの実行方法
スレッドセーフでイベントを実行することまで考えるならば、イベントの呼び出しは下記のコードとなる。
public event MyEventHandler MyEvent;
void fire(){
MyEventHandler cev;
lock(this)
cev = MyEvent;
if(cev != null)
cev(this); // イベントの呼び出し
}