yohhoyの日記

技術的メモをしていきたい日記

イベントのnullチェック回避

イベントに予め “空の匿名メソッド” を登録しておくことで、イベント呼び出し時にnullチェックを逐一記述する必要がなくなる。Null Objectパターン*1

public delegate void SomeHandler(object sender, SomeEventArgs e);
public event SomeHandler SomeEvent = delegate {};  // ★

protected virtual void OnRaiseSomeEvent(SomeEventArgs e)
{
  SomeEvent(this, e);
}

このパターンを利用しない場合、イベント呼び出し処理は下記のようになる。*2

protected virtual void OnRaiseSomeEvent(SomeEventArgs e)
{
  SomeHandler handler = SomeEvent;
  if (handler != null) {  // nullチェックが必要
    handler(this, e);
  }
}

メモ:★では匿名メソッドのパラメータリストを省略し、デリゲート型SomeHandlerからシグネチャを推論させている。MSDNも参照のこと。(ラムダ式だとこれが出来ない)

関連URL