什么是委托?什么是事件?事件與委托的區別?


什么是委托?
委托是種:引用方法的對象。 此對象可以將指針指向引用的方法,也可以說對象(委托)將消息發給訂閱者(方法)

什么是事件?事件與委托的區別?
事件是種:特殊的委托
區別:事件是解決委托的兩個缺陷
1、不小心取消掉訂閱者 (封裝訂閱)
委托允許使用 +=和= 兩種運算符,就會導致不小心取消掉訂閱者,而事件不允許使用=
2、包容類外也可以(發布)通知 (封裝發布)
事件確保只有包容類才能觸發一個事件通知 [不允許類的外部執行事件通知] (事件只能在定義的類中調用(發布))


換言之,事件提供了必要的封裝來防止任何外部類發布一個事件或者取消之前的訂閱者。這樣,就完美的解決了普通委托存在的兩個問題

 

PS:  參考《C#本質論》

 

事件 就是要解決下列代碼中:+=和= ,在外部類中發布委托 的問題

 public class Cooler
        {
            public Cooler(int temperature)
            {
                this.Temperature = temperature;
            }

            public int Temperature { get; set; }

            public void OnTemperaTureChanged(int tem)
            {
                if (tem > Temperature)
                {
                    Console.WriteLine($"Cooler On");
                }
                else
                {
                    Console.WriteLine($"Cooler Off");
                }
            }
        }

        public class Heater
        {
            public Heater(int temperature)
            {
                this.Temperature = temperature;
            }
            public int Temperature { get; set; }

            public void OnTemperaTureChanged(int tem)
            {
                if (tem < Temperature)
                {
                    Console.WriteLine($"Heater On");
                }
                else
                {
                    Console.WriteLine($"Heater Off");
                }
            }
        }

class 委托or事件
    {
        //聲明委托
        // public delegate string delegateHandle(object sender, HandleEventArgs args);

        ////聲明事件
        //public event delegateHandle eventHandle;

        ////已發事件的方法
        //public void Method(HandleEventArgs args)
        //{
        //    if (eventHandle != null)
        //    {
        //        eventHandle(this, args);
        //    }
        //}

        public delegate void delegateHandle(int tem);

        private delegateHandle _OndelegateHandleChanged;

        public delegateHandle OndelegateHandleChanged
        {
            get { return _OndelegateHandleChanged; }
            set { _OndelegateHandleChanged = value;  }
        }

        private int temperature;

        public int Temperature
        {
            get { return temperature; }
            set { temperature = value; if(OndelegateHandleChanged!=null)OndelegateHandleChanged(value); }
        }

    }

static void Main(string[] args)
        {
            委托or事件 or = new 委托or事件();
            Cooler cooler = new Cooler(80);
            Heater heater = new Heater(60);
            //or.eventHandle += Or_eventHandle;
            //or.Method(handler);
            or.OndelegateHandleChanged += cooler.OnTemperaTureChanged;
            or.OndelegateHandleChanged += heater.OnTemperaTureChanged;
            or.OndelegateHandleChanged = heater.OnTemperaTureChanged;


            or.OndelegateHandleChanged(45);
            Console.ReadLine();
        }
View Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM