[C#] eventとdelegate

ペツォルドの .NET Book Zeroから eventとdelegateの簡単な説明。
1.発信元のclass A
publicなeventを定義。

public event EventHandler InformationAlert;

event名:InformationAlert
delegate名:EventHandler
EventHandlerはSystem namespaceで定義されている。

public delegate void EventHandler(Object sender, EventArgs e);

EventArgsは同じくSystem namespaceで定義されている。eventからdelegateに渡される引数のbase classになる。
2.受け側のclass B
ハンドラを定義する。

void MyInformationAlertHandler(object sender, EventArgs e)
{
     // 処理
}

class Aのobjectをaとする。InformationAlert eventにハンドラを登録する。

  a.InformationAlert += new EventHandler(MyInformationAlertHandler);
    //あるいは .NET 2.0以降なら
  a.InformationAlert += MyInformationAlertHandler;

2.0以降では、newしなくてもよくなった。
3.class Aでeventを発行する。

if (InformationAlert != null)
      InformationAlert(this, new EventArgs());

InformationAlertにハンドラが登録されていなければ nullなので発行しない。登録されている場合は全部のハンドラが呼ばれる。InformationAlert eventへの引数は、ハンドラの引数と同じ。第一引数は呼び出したobjectになる。第二引数はハンドラに渡す情報。いろいろ渡したいときには、EventArgsをbaseとする子クラスを定義する。
.NET 2.0以降では、delegateをanonymousで宣言することができるおうになり、

Timer tmr = new Timer();
tmr.Elapsed += delegate(object sender, ElapsedEventArgs args)
{
    // 処理
}

のように直接delegateキーワードで処理を書けるようになった。
ペツォルドは、便利だがローカル変数へのアクセスなどの使い方がトリッキーだと説明している。
.NET Book Zeroでは、timerのイベントで10秒ごとに呼ばれるハンドラを作って見せている。

広告
%d人のブロガーが「いいね」をつけました。