什么是委托?什么是事件?事件与委托的区别?

什么是委托?
委托是种:引用方法的对象。 此对象可以将指针指向引用的方法,也可以说对象(委托)将消息发给订阅者(方法)

什么是事件?事件与委托的区别?
事件是种:特殊的委托
区别:事件是解决委托的两个缺陷
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
posted @ 2019-12-23 13:55  Index_Zero  阅读(2232)  评论(0编辑  收藏  举报