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