2015年11月18日 星期三

C14_3 事件存取子的例子

using System;
namespace C14_3
{
    //宣告一個delegate
    public delegate void EventHandler();
    public class MyClass
    {
        //宣告一個成員變數來保存事件控制碼,(事件被觸發時候被叫用的delegate)
        private EventHandler m_Handler = null;
        //觸發事件
        public void FireMyEvent()
        {
            if (m_Handler != null)
            {
                m_Handler();
            }
        }
        //宣告事件存取子
        public event EventHandler MyEvent
        {
            //新增存取子
            add
            {
                //注意,存取子中實際包含了一個名為value的隱含參數
                //該參數的值即為客戶程式叫用 += 時傳遞過來的delegate
                Console.WriteLine("MyEvent add 被叫用,value的HashCode為:"+value.GetHashCode());
                if (value != null) { m_Handler = value; }
                //設置m_Handler域保存的handler
            }
            //刪除存取子
            remove
            {
                Console.WriteLine("MyEvent remove 被叫用,value的HashCode為:",value.GetHashCode());
                //設置m_Handler 為null,該事件不再被觸發
                if (value == m_Handler) { m_Handler = null; }
            }
        }
    }
    public class Program
    {
        //真正的事件處理函數
        public static void MyEventHandler()
        {
            Console.WriteLine("這是一個事件!");
        }
        public static void Main()
        {
            MyClass my = new MyClass();
            //基於MyEventHandler函數定義一個EventHandler
            EventHandler MyHandler = new EventHandler(MyEventHandler);
            Console.WriteLine("MyHandler的HashCode為:"+MyHandler.GetHashCode());
            Console.WriteLine("--------------------------------");
            //預定事件
            Console.WriteLine("my.myEvent += MyHandler 被叫用");
            my.MyEvent += MyHandler;
            //觸發事件
            Console.WriteLine("Mainc函數處發my的MyEvent事件!");
            my.FireMyEvent();
            //撤銷事件
            Console.WriteLine("my.MyEvent -= Myhandler 被叫用");
            my.MyEvent -= MyHandler;
            Console.WriteLine("----------------------------------");
            //再次事圖觸發事件
            Console.WriteLine("Mainc函數式圖在撤銷事件後觸發my的MyEvent事件!");
            my.FireMyEvent();
        }
    }
}

沒有留言: