C# 入門 & 実践 / C sharp
4-28. イベント - 2 - 独自のイベントデータを使用する
単純な例で
BbEventArgs が独自のイベント情報クラスです。
このイベント情報をイベント発行時に
別のクラス( SayHello , SayGoodbye )へ
渡すことが出来るということです。
マルチスレッドでもなんでもないのでイメージし辛い部分はありますが
とりあえず独自のデータをイベント発生時に別のクラスへ渡せるということです^-^;
// イベント情報
class BbEventArgs : EventArgs
{
private readonly int cnt = 0;
public BbEventArgs( int cnt )
{
this.cnt = cnt;
}
public int Cnt
{
get { return cnt; }
}
}
// メインで動くクラス。
class BbEvent
{
private int mycnt = 0;
// 独自のイベント情報を利用するためのハンドラー
public delegate void BbHandler(object o, BbEventArgs e);
// イベントハンドラーのデリゲート宣言です。。。
public event BbHandler MyHandler;
// イベントを発生させるためのメソッド。
protected virtual void OnMyHandler( BbEventArgs e )
{
if (MyHandler != null)
{
MyHandler(this, e);
}
}
// このメソッド内でイベント呼び出しがあります。
public void Run()
{
int i = 1;
for (;;)
{
mycnt++;
// 10 ミリ秒休憩
Thread.Sleep( 10 );
// 30 で割り切れるときにイベント発生
if ((i % 30) == 0)
{
// イベントオブジェクト生成
BbEventArgs be = new BbEventArgs(i);
// イベントを発生させる!
OnMyHandler(be);
}
i++;
if (i > 100)
{
i = 1;
}
if (mycnt > 300)
{
Console.WriteLine("終了");
// 300 ループして終わる
return;
}
}
}
}
// イベント発生時の動作 1
class BbHello
{
private int mycnt = 0;
// Subscribe :メソッドを設定
public void setMethod(BbEvent e)
{
e.MyHandler += new BbEvent.BbHandler(SayHello);
}
//
public void SayHello(Object o, BbEventArgs e)
{
mycnt++;
if (e.Cnt <= 60)
{
Console.WriteLine("SayHello : mycnt = {1} / イベント情報 cnt = {0}", e.Cnt, mycnt);
}
}
}
// イベント発生時の動作 1
class BbGoodbye
{
private int mycnt = 0;
// Subscribe :メソッドを設定
public void setMethod(BbEvent e)
{
e.MyHandler += new BbEvent.BbHandler(SayGoodbye);
}
//
public void SayGoodbye(Object o, BbEventArgs e)
{
mycnt++;
if (e.Cnt >= 60)
{
Console.WriteLine("SayGoodbye : mycnt = {1} / イベント情報 cnt = {0}", e.Cnt, mycnt);
}
}
}
class MyTester
{
static void Main()
{
// メイン:イベント発行を行うクラス
BbEvent be = new BbEvent();
// イベント発行時の実行メソッド
BbHello bh = new BbHello();
BbGoodbye bg = new BbGoodbye();
// subscribe : 実行メソッドをセットする
bh.setMethod(be);
bg.setMethod(be);
// Run を実行!
be.Run();
}
}
SayHello : mycnt = 1 / イベント情報 cnt = 30
SayHello : mycnt = 2 / イベント情報 cnt = 60
SayGoodbye : mycnt = 2 / イベント情報 cnt = 60
SayGoodbye : mycnt = 3 / イベント情報 cnt = 90
SayHello : mycnt = 4 / イベント情報 cnt = 30
SayHello : mycnt = 5 / イベント情報 cnt = 60
SayGoodbye : mycnt = 5 / イベント情報 cnt = 60
SayGoodbye : mycnt = 6 / イベント情報 cnt = 90
SayHello : mycnt = 7 / イベント情報 cnt = 30
SayHello : mycnt = 8 / イベント情報 cnt = 60
SayGoodbye : mycnt = 8 / イベント情報 cnt = 60
SayGoodbye : mycnt = 9 / イベント情報 cnt = 90
終了
匿名メソッド
// Subscribe :メソッドを設定
public void setMethod(BbEvent e)
{
// e.MyHandler += new BbEvent.BbHandler(SayGoodbye);
e.MyHandler += SayGoodbye;
}
// ここは変わらず
public void SayGoodbye(Object o, BbEventArgs e)
{
このように、new BbEvent.BbHandler( ) を省略することが出来ます。
さらには
public void setMethod(BbEvent e)
{
// e.MyHandler += new BbEvent.BbHandler(SayGoodbye);
e.MyHandler += delegate(Object o, BbEventArgs ev)
{
mycnt++;
if (ev.Cnt >= 60)
{
Console.WriteLine("SayGoodbye : mycnt = {1} / イベント情報 cnt = {0}", ev.Cnt, mycnt);
}
};
}
と SayGoodbye メソッドはなくなり、デリゲートを追加する部分にそのままメソッドの内容を記入できます!
BbEventArgs ev ← eとかぶるので ev へ変更
4-27 イベント - 1 - イベントの発生 / イベントの実装 «
4. C# 入門 Level 2 »
4-29. イベント - 3 - 非同期で実行&コールバックで返り値を取る!
C# 入門 & 実践 / C sharp