カテゴリー
C

独習C#第3版、P449 イベント

using System;

namespace Chapter01All
{
    // とても簡単なイベントの例
    // イベント用のデリゲートの宣言
    delegate void MyEventHandler(); //←イベントで使うデリゲートを宣言する

    // イベントの送信側のクラス
    class MyEvent
    {
        public event MyEventHandler SomeEvent; //←イベントを宣言する

        // イベント送信を実装したメソッド
        public void Fire()
        {
            if (SomeEvent != null)
                SomeEvent(); //←イベントを送信する
        }
    }
    class OtherEvent
    {
        public event MyEventHandler anOtherEvent;
        public void Water()
        {
            if (anOtherEvent != null)
                anOtherEvent();
        }
    }

    class EventDemo
    {
        static void Handler()
        {
            Console.WriteLine("Event fire occurred");
        }
        static void OtherHandler()
        {
            Console.WriteLine("Event water occurred");
        }


        static void Main()
        {
            MyEvent evt = new MyEvent(); //←イベントを送信する側のインスタンスを作成する
            // ハンドラをイベントリストに追加する
            evt.SomeEvent += Handler; //←イベントのチェーンにハンドラを追加する
            evt.SomeEvent += OtherHandler;
            // イベントを人為的に発生させる
            evt.Fire(); //←イベントを発生させる

            OtherEvent oevt = new OtherEvent();
            oevt.anOtherEvent += OtherHandler;
            oevt.Water();
        }
    }
}

 何回か見てはいましたが、どうもピンときません。この辺がC#を理解する上での肝かもしれません。例題と同じようにイベントを一個追加して見ました。上の例では、delegateが一個しかないので、同じように動作する場合は、問題なかったのですが、動作が違うとダメだったので、もう一つのdelegateを定義したのが、下です。

using System;

namespace Chapter01All
{
    // とても簡単なイベントの例
    // イベント用のデリゲートの宣言
    delegate void MyEventHandler(); //←イベントで使うデリゲートを宣言する
    delegate void OtherMyEventHandler(String s);

    // イベントの送信側のクラス
    class MyEvent
    {
        public event MyEventHandler SomeEvent; //←イベントを宣言する

        // イベント送信を実装したメソッド
        public void Fire()
        {
            if (SomeEvent != null)
                SomeEvent(); //←イベントを送信する
        }
    }
    class OtherEvent
    {
        public event OtherMyEventHandler anOtherEvent;
        public void Water(String str)
        {
            if (anOtherEvent != null)
                anOtherEvent(str);
        }
    }

    class EventDemo
    {
        static void Handler()
        {
            Console.WriteLine("Event fire occurred");
        }
        static void OtherHandler(String s)
        {
            Console.WriteLine(s);
        }


        static void Main()
        {
            MyEvent evt = new MyEvent(); //←イベントを送信する側のインスタンスを作成する
            // ハンドラをイベントリストに追加する
            evt.SomeEvent += Handler; //←イベントのチェーンにハンドラを追加する
            // イベントを人為的に発生させる
            evt.Fire(); //←イベントを発生させる

            OtherEvent oevt = new OtherEvent();
            oevt.anOtherEvent += OtherHandler;
            oevt.Water("Water Event Occurred");
        }
    }
}

イベントに引数を持たせる場合もあるでしょうから、delegateを別に作って、試行錯誤しました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

inserted by FC2 system