接上篇继续写,顺便也做个记录https://blog.youkuaiyun.com/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类的繁琐工作,增强了稳定性,也提升了工作效率。