1. 程式人生 > >簡單理解委託、事件以及小Demo

簡單理解委託、事件以及小Demo

對於委託和事件的理解只是停留在表層,來記錄下學習過程

委託(Delegate) 是存有對某個方法的引用的一種引用型別變數。引用可在執行時被改變。

事件(Event) 基本上說是一個使用者操作,如按鍵、點選、滑鼠移動等等,或者是一些出現,如系統生成的通知。應用程式需要在事件發生時響應事件。例如,中斷。事件是用於程序間通訊。

事件在類中宣告且生成,且通過使用同一個類或其他類中的委託與事件處理程式關聯。

所以說事件的使用需要依託委託來實現

事件是釋出-訂閱模型的,所謂釋出器,就是包含有委託和事件的那個類,訂閱器就是接受該事件的類(按照我目前的理解來講,就是委託所指向的方法的那個類,因為事件是需要利用委託來建立,而實現委託就需要實現與委託相同引數、返回值的方法)

demo

 /*釋出器*/
    class TestEvent_Publishier
    {
        //委託建立
        public delegate void BoilHandler(string message);
        //事件建立
        public event BoilHandler BoilEvent;

        //用來觸發事件的方法
        protected virtual void GoBoilEvent(string message)
        {
            if(BoilEvent !=null)
            {
                BoilEvent(message);
            }
            else
            {
                Console.WriteLine("Please check!");
                Console.ReadLine();
            }
        }

        public TestEvent_Publishier()
        {
            Trigger(5);
        }

        //觸發方法需要觸發的條件
        public void Trigger(int temperature)
        {
            if(temperature>50&&temperature<100)
            {
                GoBoilEvent("temp too high!");
            }
            if (temperature < 50 || temperature > 100)
            {
                GoBoilEvent("temp error!");
            }
        }
    }

    /*訂閱器*/
    class Subscriber
    {
        public void print(string message)
        {
            Console.WriteLine(message);
            Console.ReadLine();
        }
    }
 /*觸發*/
    class Program
    {
        static void Main(string[] args)
        {
            //例項化釋出器類
            TestEvent_Publishier t = new TestEvent_Publishier();
            //例項化訂閱器類
            Subscriber s = new Subscriber();

            //先建立事件
            t.BoilEvent += new TestEvent_Publishier.BoilHandler(s.print);
            t.Trigger(60);
            t.Trigger(20);
            t.Trigger(20);
            t.Trigger(20);
            t.Trigger(20);

        }
    }