イベント


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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); // イベントの呼び出し
}

読んでいる本


Effective C#

QLOOKアクセス解析

ここを編集