C# 入門 & 実践 / C sharp

4-27. イベント - 1 - イベントの発生 / イベントの実装


イベントの発生とは、クリックしたとかキーを押したとかそいう情報を伝える側の操作です。

わかり難いのですが、・・・

イベントデータ : System.EventArgs
デリゲートハンドラ : System.EventHandler
を使用するそうです。
カスタムデータを使用する場合はそれぞれを継承したクラスを利用します。

1. そのまま使ってみる。

    class BbEvent
    {
        private int cnt = 0;
        // イベントハンドラーのデリゲート宣言です。。。
        public EventHandler MyHandler;

        // イベントを発生させるためのメソッド。
        protected virtual void OnMyHandler(EventArgs e)
        {
            if (MyHandler != null)
            {
                MyHandler(this, e);
            }
        }


        // このメソッド内でイベント呼び出しがあります。
        public void setCnt(int i)
        {
            cnt += i;
            if ( (cnt % 3) == 0)
            {
                OnMyHandler(new EventArgs());
            }
        }
    }

    class MyChild
    {
        private int i = 0;
        public void TestHander(Object sender, EventArgs e)
        {
            i++;
            Console.WriteLine(" mychild.i が増えたよ! i = {0}" , i);
        }
    }
    class MyTester
    {
        // MyHanderで使用するメソッド
        public static void TestHander(Object sender, EventArgs e)
        {
            Console.WriteLine("イベント発生!");
        }
        static void Main()
        {
            
            BbEvent be = new BbEvent();
            MyChild mc = new MyChild();
            be.MyHandler += new EventHandler(TestHander);
            be.MyHandler += new EventHandler(mc.TestHander);

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("i = {0}" , i);
                be.setCnt(1);
            }
        }
    }

i = 0
i = 1
i = 2
イベント発生!
mychild.i が増えたよ! i = 1
i = 3
i = 4
i = 5
イベント発生!
mychild.i が増えたよ! i = 2
i = 6
i = 7
i = 8
イベント発生!
mychild.i が増えたよ! i = 3
i = 9

上手く3で割り切れたときにイベントが発生してメソッド呼び出しに成功しています。

規定のEventHanderメソッドを利用して MyHandler をデリゲート宣言しています。
public event EventHandler MyHandler;

event : イベント宣言!
これを宣言しておくとデリゲートの代入が出来なくなります。

最初は空でも
be.MyHandler += new EventHandler(TestHander);
と+演算子を利用します。

このような初期化は出来ません!
be.MyHandler = new EventHandler(TestHander);
もちろん、 event 宣言をしない場合は可能です。




4-26. デリゲート - 2 - static デリゲート / マルチキャストデリゲート « 4. C# 入門 Level 2 » 4-28. イベント - 2 - 独自のイベントデータを使用する


C# 入門 & 実践 / C sharp