委托应该使用的地方二--观察者模式--引出--事件:event

代码:在猫叫以后触发一系列的事,这个版本的猫比较累自己叫完了以后,,还要去找其他对象

    public class Cat
   {
        public void Miao()
        {
            Console.WriteLine("miao,miao,miao!");
            new Dog().Wang();
            new Cock().Gu();
            new People().What();
        }
   }

 public class Cock
    {
        public void Gu()
        {
            Console.WriteLine("Gu.Gu,Gu!");
        }

    }

 public class Dog
    {
        public void Wang()
        {
            Console.WriteLine("Wang,Wang,Wang!");
        }
    }

public class People
    {
        public void What()
        {
            Console.WriteLine("是不是饿了!");
        }
    }

依赖太重,每个类的修改都可能去修改Cat ,Cat及其不稳定

职责耦合,猫自己叫完还要去找各种对象,控制他们的反应的顺序

任意环节增加减少都会修改猫

委托版本:  观察者模式

static void Main(string[] args)
{
            var cat = new Cat();
            cat.MiaoDelegate += new Dog().Wang;
            cat.MiaoDelegate += new Cock().Gu;
            cat.MiaoDelegate += new People().What;
            cat.Miao();
            Console.ReadLine();
}


 public class Cat
   {
        //声明一个委托实例,用于存放猫叫会触发的方法
        public Action MiaoDelegate;

        public void Miao()
        {
            Console.WriteLine("miao,miao,miao!");
            DoMiaoAction();
        }

        //调用委托中的方法
        public void DoMiaoAction()
        {
            this.MiaoDelegate?.Invoke();
        }

   }

这个有个新语法:  在变量后边加? 表示如果 为 null 就什么也不发生 

提示: 按住alt 移动鼠标可以编写多行代码

好处:Cat 变得稳定,职责单一, 还可以实例化 ,各种响应的Cat

现在将代码改为 事件 

 //声明一个委托实例,用于存放猫叫会触发的方法
        public event Action Miaohandler;

        public void Miao()
        {
            Console.WriteLine("miao,miao,miao!");
            DoMiaoEvent();
        }

        //调用委托中的方法
        public void DoMiaoEvent()
        {
            this.Miaohandler?.Invoke();
        }

现在两种代码的不同点其实就是 带不带 event 关键字

带关键字就是事件,不带就是委托

到底有什么区别呢?

看智能提示的不同: 

有  event 关键字的智能提示:是闪电符号的事件

没有event的智能提示:它只是作为一个字段

在用法上有什么区别呢?

没有event 关键字的时候我们可以在任意地方对 其进行清空和 调用操作:

加上event 以后上面的代码就会报错,错误信息明确说明只能+=和 -= 操作 而且即便是在子类总去调用也不行:

子类中的情况:

添加 event 以后 委托就成了 事件 , 只能在内部进行 Invoke 和其他操作,在外部只能 +=和_=操作

委托与事件的关系?

委托是一种类型,事件是委托类型的一个实例,加上一个event 关键字的权限控制

猜你喜欢

转载自blog.csdn.net/qq_36445227/article/details/90692064