イベント定義 - C#

イベントを起こすには、

  • イベントハンドラの型を宣言する
  • イベントを定義する
  • イベントハンドラであるメソッドを作成する
  • イベントにイベントハンドラを登録する
以上の四つが必要ですが、今回は主に『イベントハンドラの型宣言』と『イベント定義』について。


簡単にイベントを作成するには既存のイベントハンドラの型を利用する。

System 名前空間にある EventHandler を利用する

何もしなくともSystem.EventHandlerは使えるはずなのでそれを使って
例えば、こんな感じでイベントを定義する
public event EventHandler fuga;
イベントハンドラの型宣言がいらないのでラク。

ComponentModel 名前空間にある INotifyPropertyChanged を利用する

usingディレクティブにSystem.ComponentModelを追加するとPropertyChangedEventHandler を利用できるようになる。

こんな感じでイベント定義する
public event PropertyChangedEventHandler PropertyChanged;

要するにこの一行を書かなくてすむ。
public PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e);

PropertyChanged イベントが発生したら行われるメソッドを追加するには以下のように。
this.PropertyChanged += new PropertyChangedEventHandler(hoge_PropertyChanged);

PropertyChanged イベントを発生させるメソッドの形がこんな感じ。
public void OnPropertyChanged(string pname)
{
    if (this.PropertyChanged != null)
    {
        this.PropertyChanged(this, new PropertyChangedEventArgs(pname));
    }
}

独自のイベントハンドラを定義する

基本的にデリゲート型なのでデリゲートを理解していれば簡単なので、デリゲートを理解していないならまずはそちらから学ぶべき。

はっきり言うと独自に作成したイベントハンドラの型が結局System.EventHandlerと同じなら意味がない。

メリットは以下のように独自に命名できることぐらいか。
public delegate void fugaEventHandler(object sender, EventArgs e);
「だからどうした」「混乱するからやめてくれ」という声も聞こえなくもない。

こんな感じで引数なしとかもできちゃいますが…
public delegate void fugaEventHandler();


あとはイベントを定義して
public event fugaEventHandler fuga;

イベントハンドラの定義と同じ型のメソッドをイベントに追加する
this.fuga += new fugaEventHandler(hoge_fuga);

いつ追加するか
基本はコンストラクタで。
慣れたらイベントにイベントハンドラを追加するメソッドを作って動的に追加する、なんてことも。

が、追加されているイベントハンドラを把握する処理が書けないと危ういものに成りかねない。

どうやってそのイベントに追加されているイベントハンドラを知ることが出来るか
リフレクションで可能... かな?

0 Comments:

Recent Posts