委托系列08-委托和事件的区别
一、使用
&emsp:?案例:通过委托和事件实现相同的动作
1、委托实现方式
代码:
public class Cat
{
public Action MiaoAction = null;
///
/// 这个方法仅仅只是Miao一声
/// 引发的动作---可以放到多播委托中去
///
public void MiaoDelegate()
{
//方式一:
//if (MiaoAction != null)
//{
// MiaoAction.Invoke();
//}
//方式二:
MiaoAction?.Invoke();//?. 如果不为null ,就执行后面的动作
}
}
1、调用
Console.WriteLine("************************this is delegate****************************");
{
cat.MiaoAction += new Dog().Wang; //狗叫了
cat.MiaoAction += new Mouse().Run;//老鼠跑了
cat.MiaoAction += new Mother().Wispher;
cat.MiaoAction += new Baby().Cry; // 小孩哭了
//cat.MiaoAction += new Mother().Wispher;
cat.MiaoAction += new Father().Roar;
cat.MiaoAction += new Neighbor().Awake;
cat.MiaoAction += new Stealer().Hide;
//cat.MiaoAction = null;
//执行委托
cat.MiaoDelegate();
}
2、输出结果
2、事件实现方式
代码:
public class Cat
{
public Action MiaoAction = null;
///
/// 这个方法仅仅只是Miao一声
/// 引发的动作---可以放到多播委托中去
///
public void MiaoDelegate()
{
//方式一:
//if (MiaoAction != null)
//{
// MiaoAction.Invoke();
//}
//方式二:
MiaoAction?.Invoke();//?. 如果不为null ,就执行后面的动作
}
//事件
public event Action MiaoEventHanlder = null;
///
/// 这个方法仅仅只是Miao一声
/// 引发的动作---可以放到多播委托中去
///
public void MiaoEnvent()
{
//Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//Console.WriteLine("{0} MiaoEnvent", this.GetType().Name);
MiaoEventHanlder?.Invoke();//?. 如果不为null ,就执行后面的动作
}
}
1、调用
Console.WriteLine("************************this is MiaoEventHanlder****************************");
{
cat.MiaoEventHanlder += new Mouse().Run;//老鼠跑了
cat.MiaoEventHanlder += new Dog().Wang; //狗叫了
cat.MiaoEventHanlder += new Mother().Wispher;
cat.MiaoEventHanlder += new Baby().Cry; // 小孩哭了
cat.MiaoEventHanlder += new Father().Roar;
cat.MiaoEventHanlder += new Neighbor().Awake;
cat.MiaoEventHanlder += new Stealer().Hide;
cat.MiaoEnvent();
}
3、输出结果对比
4、总结
??委托和事件的实现效果一致。
二、委托和事件的区别
??从上面的案例可以看得出来,委托和事件都能实现同样的效果,那他们之间有什么区别呢?
1、场景一
??下面有个ChildCat类,继承Cat类:
public class ChildCat : Cat
{
public void Show()
{
//子类中执行父类的多播委托
base.MiaoAction(); //可以执行
//子类中执行父类的事件
base.MiaoEventHanlder.Invoke();//不能执行
}
}
在上面的Show方法中,分别执行父类的多播委托和事件
从上图可以看出,事件不能在它的子类执行。
2、场景二
??分别在其他类(非Cat类的继承类)中,执行多播委托和事件。
执行多播委托:
执行事件:
从上图可以得知:
在其他类中,可以执行多播委托,不能执行事件。
3、为什么会有上面这种现象呢?
??既然委托和事件都能实现同样的效果,那为什么还要再出现一个事件呢?
??主要是从安全性考虑。事件只能在声明它的类里面调用,其他类包括子类都不可以调用。这样就可以调用它只能在声明它的类里面,外部方法不会破坏它的执行逻辑。