委托系列08-委托和事件的区别


一、使用

&emsp:?案例:通过委托和事件实现相同的动作

1、委托实现方式

代码:

    public class Cat
    {
        public Action MiaoAction = null;

        /// 
        /// 这个方法仅仅只是Miao一声
        /// 引发的动作---可以放到多播委托中去
        /// 
        public void MiaoDelegate()
        {
            //方式一:
            //if (MiaoAction != null)
            //{
            //    MiaoAction.Invoke();
            //}

            //方式二:
            MiaoAction?.Invoke();//?. 如果不为null ,就执行后面的动作 
        }
    }

1、调用

                    Console.WriteLine("************************this is  delegate****************************");
                    {
                        cat.MiaoAction += new Dog().Wang; //狗叫了
                        cat.MiaoAction += new Mouse().Run;//老鼠跑了
                        cat.MiaoAction += new Mother().Wispher;
                        cat.MiaoAction += new Baby().Cry; // 小孩哭了
                        //cat.MiaoAction += new Mother().Wispher;
                        cat.MiaoAction += new Father().Roar;
                        cat.MiaoAction += new Neighbor().Awake;
                        cat.MiaoAction += new Stealer().Hide;
                        //cat.MiaoAction = null;

                        //执行委托
                        cat.MiaoDelegate();
                    }

2、输出结果

2、事件实现方式

代码:

    public class Cat
    {
        public Action MiaoAction = null;

        /// 
        /// 这个方法仅仅只是Miao一声
        /// 引发的动作---可以放到多播委托中去
        /// 
        public void MiaoDelegate()
        {
            //方式一:
            //if (MiaoAction != null)
            //{
            //    MiaoAction.Invoke();
            //}

            //方式二:
            MiaoAction?.Invoke();//?. 如果不为null ,就执行后面的动作 
        }

        //事件
        public event Action MiaoEventHanlder = null;

        /// 
        /// 这个方法仅仅只是Miao一声
        /// 引发的动作---可以放到多播委托中去
        /// 
        public void MiaoEnvent()
        {
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
            //Console.WriteLine("{0} MiaoEnvent", this.GetType().Name);
            MiaoEventHanlder?.Invoke();//?. 如果不为null ,就执行后面的动作 
        }
    }

1、调用

                        Console.WriteLine("************************this is  MiaoEventHanlder****************************");
                        {
                            cat.MiaoEventHanlder += new Mouse().Run;//老鼠跑了
                            cat.MiaoEventHanlder += new Dog().Wang; //狗叫了
                            cat.MiaoEventHanlder += new Mother().Wispher;
                            cat.MiaoEventHanlder += new Baby().Cry; // 小孩哭了 
                            cat.MiaoEventHanlder += new Father().Roar;
                            cat.MiaoEventHanlder += new Neighbor().Awake;
                            cat.MiaoEventHanlder += new Stealer().Hide;
                            
                            cat.MiaoEnvent();
                        }

3、输出结果对比

4、总结

??委托和事件的实现效果一致。

二、委托和事件的区别

??从上面的案例可以看得出来,委托和事件都能实现同样的效果,那他们之间有什么区别呢?

1、场景一

??下面有个ChildCat类,继承Cat类:

    public class ChildCat : Cat
    {
        public void Show()
        {
            //子类中执行父类的多播委托
            base.MiaoAction(); //可以执行

            //子类中执行父类的事件
            base.MiaoEventHanlder.Invoke();//不能执行
        }
    }

在上面的Show方法中,分别执行父类的多播委托和事件

从上图可以看出,事件不能在它的子类执行。

2、场景二

??分别在其他类(非Cat类的继承类)中,执行多播委托和事件。
执行多播委托:

执行事件:

从上图可以得知:
在其他类中,可以执行多播委托,不能执行事件。

3、为什么会有上面这种现象呢?

??既然委托和事件都能实现同样的效果,那为什么还要再出现一个事件呢?
??主要是从安全性考虑。事件只能在声明它的类里面调用,其他类包括子类都不可以调用。这样就可以调用它只能在声明它的类里面,外部方法不会破坏它的执行逻辑。

相关