代码:在猫叫以后触发一系列的事,这个版本的猫比较累自己叫完了以后,,还要去找其他对象
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 关键字的权限控制