C#中委托与事件的学习小结(二)

接上篇继续写,顺便也做个记录https://blog.csdn.net/gkht007/article/details/82726208

下面该介绍事件了。事件就是在委托类型前面加上一个event关键字,就变成了事件了,事件的具体一些用法也和委托非常类似!(哈哈,这么理解应该没毛病吧~!)当然,两者之间还是有区别的。我们用一个小例子来做个小说明。

例:  class Program
    {

        public delegate void MyDelegate();//定义一个无参数,无返回值的委托。

        public event MyDelegate mydelegate;//在一个委托类型的变量前面加上一个event,就变成了一个事件

        static void Test1()
        {
            Console.WriteLine("test1");
        }
        static void Main(string[] args)
        {
            Program p=new Program();
            p.mydelegate = Test1;
            p.mydelegate();
            Console.ReadKey();
        }

在例子中,我们发现Program这个类中,定义了一个事件mydelegate,然后我们通过主函数中对新类型变量p中的mydelegate赋值来取的Test1方法的结果。而这个事件的调用必须在类中进行,在类外无法进行调用。而委托则可以在类外进行声明和调用。这就是两者的区别。其实可以理解为事件是特殊的委托,只能在创建他的类中进行调用,以此来规避错误。

最后写一点对于观察者模式的感想,也算是学习委托的一个最后总结吧。

观察者模式,是一种设计思路,其核心思想是存在一个被观察者和若干观察者,观察者根据被观察者的状态切换,不断调整自身的状态。在编程工作中,这种思路能大大节约我们代码量,减少代码间的耦合性,同时降低更新维护时的代码量,增加工作效率。下面我通过今天学习的一个小例子,与大家分享一下这种模式,以及委托这种方法,在这个例子中的作用。

//首先是我们的被观察者类,也就是猫类

class Cat
    {
        private string name;
        private string color;

        public Cat(string name, string color)
        {
            this.name = this.name;
            this.color = color;
        }
        //猫进屋(猫的状态发生改变)(被观察者的状态发生改变)
        public void CatComing()
        {
            Console.WriteLine(color + "的猫" + name + "过来了,喵喵喵");
            if (catCome != null)
                catCome();
        }

        public event Action catCome;//表示声明一个事件,发布了一个消息。
    }

这里我们看到,我们定义了一个catCome事件,将其放到Cat这个类下。然后我们在CatComing这个方法中调用它。

接着,我们创建一个C#脚本下的Mouse类:

//这个就是我们的观察者类,我们通过观察猫(也就是被观察者)的状态来调用方法RunAway;

 class Mouse
    {
        private string name;
        private string color;

        public Mouse(string name, string color,Cat cat)//增加cat参数,代表订阅这个消息
        {
            this.name = name;
            this.color = color;
            cat.catCome += this.RunAway;
        }

        public void RunAway()
        {
            Console.WriteLine(color+"的老鼠"+name+"说:老猫来了,赶紧跑!");
        }

    }

我们看到在Cat类中时间catCome发布了一个消息,然后在Mouse类中,通过+=这个操作符,将RunAway这个方法,添加到catCome消息集合中,从而完成对被观察者Mouse的一个同步更新。最后写一下主函数:

  class Program
    {
        static void Main(string[] args)
        {
            Cat cat=new Cat("加菲猫","黄色");
            Mouse mouse1=new Mouse("米奇","黑色",cat);
            Mouse mouse2=new Mouse("米妮","红色",cat);
            Mouse mouse3=new Mouse("XX","紫色",cat);
            Mouse mouse4 = new Mouse("水", "紫色",cat);
            cat.CatComing();
            //cat.catCome();//定义事件后,其不可以在类的外部触发,只可以直接在类的内部调用
            Console.ReadKey();
        }
    }

这里多写了一句catCome()方法,就是为了让大家注意,事件catCome是在Cat类中定义的,所以只能在Cat类中进行使用,不可以在类外进行触发。所以我们就通过CatComing这个方法,将所有被观察者状态进行一个同步。与此同时,这样编写的代码也非常便利与后期的更新,只需要在主函数中添加Mouse类的实例化,就可以实现与Cat类的同步更新,同时减少了修改Cat类的繁琐工作,增强了稳定性,也提升了工作效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值