委托与事件的区别
`
前言
事件(event)基于委托,
为委托提供了一个发布/订阅机制,
我们可以说事件是一种具有特殊签名的委托。
一、通过三种形式来展示事件和委托的区别
- 既没有使用事件也没有使用委托
- 使用委托
- 使用事件
二、案列演示
1.一般形式
代码如下(示例):
例一方法的弊端在于:
若老鼠数量增加时,我们需要更改Cat类中的CatComing方法
1.添加形式参数(我们若想要在Cat类中的CatComing方法中使用Mouse类的方法我们需要加入形式参数)
2.添加方法mousex.Runaway()
class Cat
{
private string name;
private string color;
public Cat(string name,string color)
{
this.name = name;
this.color = color;
}
public void CatComing(Mouse mouse1,Mouse mouse2)
{
Console.WriteLine("猫来了");
mouse1.Runaway();
mouse2.Runaway();
}
}
class Mouse
{
private string name;
private string color;
public Mouse(string name,string color)
{
this.name = name;
this.color = color;
}
public void Runaway()
{
Console.WriteLine(name + "开始跑了");
}
}
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("加菲猫", "yellow");
Mouse mouse1 = new Mouse("米奇", "red");
Mouse mouse2 = new Mouse("米二", "green");
Mouse mouse3 = new Mouse("米三", "black");
cat.CatComing();
Console.ReadKey();
}
}
2.使用委托进行优化
代码如下(示例):
- 在Cat类中CatComing方法里我们需先判断委托是否为null再进行执行
- 在Program类中委托是通过注册的方式+= or-= 且注册加入方法名不含()
- 相比上一个方式 委托让我们不再需要每添加一只猫就需要改变Cat类中的方法
- 不足在于:每次添加猫仍需要注册方法加入委托
class Mouse
{
private string name;
private string color;
public Mouse(string name,string color)
{
this.name = name;
this.color = color;
}
public void Runaway()
{
Console.WriteLine(name + "开始跑了");
}
}
class Cat
{
private string name;
private string color;
public Cat(string name,string color)
{
this.name = name;
this.color = color;
}
public void CatComing()
{
Console.WriteLine("猫来了");
if (CatCome != null)
CatCome();
}
public Action CatCome;
}
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("加菲猫", "yellow");
Mouse mouse1 = new Mouse("米奇", "red");
cat.CatCome += mouse1.Runaway;
Mouse mouse2 = new Mouse("米二", "green");
cat.CatCome += mouse2.Runaway;
Mouse mouse3 = new Mouse("米三", "black");
cat.CatCome += mouse3.Runaway;
cat.CatComing();
Console.ReadKey();
}
}
使用事件进行优化
与上例区别在于:
事件不可以在外部调用cat.CatCome()无法在主函数中调用
而委托可在外部调用 (易出错)
通过在Mouse类中对构造函数的更改,减少代码量
补充构造构造函数与主函数中的Mouse mouse1= new Mouse()相对应
构造函数内有几个参数 new mouse(对应参数)
class Mouse
{
private string name;
private string color;
public Mouse(string name,string color,Cat cat)
{
this.name = name;
this.color = color;
cat.CatCome += this.Runaway;
}
public void Runaway()
{
Console.WriteLine(name + "开始跑了");
}
}
class Cat
{
private string name;
private string color;
public Cat(string name,string color)
{
this.name = name;
this.color = color;
}
public void CatComing()
{
Console.WriteLine("猫来了");
if (CatCome != null)
CatCome();
}
public event Action CatCome;
}
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("加菲猫", "yellow");
Mouse mouse1 = new Mouse("米奇", "red",cat);
Mouse mouse2 = new Mouse("米二", "green",cat);
Mouse mouse3 = new Mouse("米三", "black",cat);
cat.CatComing();
Console.ReadKey();
}
}