C#委托与事件
这几天小白我重新温习了siki讲的C#的委托与事件,为了防止忘记,写下此文
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法。我们叫做代码,
废话不多说,代码说话,
我们从观察者设计模式来看委托。猫捉老鼠的游戏,猫来了,老鼠就要跑,这里老鼠是观察者,猫是被观察者,当猫有(猫来了)这个动作时,这时观察者老鼠就执行(逃跑)这个动作
猫的类如下:
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(color + "的猫" + name + "过来了,喵喵喵"); if (CatCome != null) { CatCome(); //调用委托 } } public Action CatCome; //声明一个猫来了的委托 }
老鼠的类如下:
private string name; private string color; public Mouse(string name,string color,Cat cat) { this.name = name; this.color = color; } public void RunAway() { Console.WriteLine(color + "的老鼠" + name + "说:猫来了,赶紧跑"); }
main方法如下:
static void Main(string[] args) { Cat cat = new Cat("加菲猫", "黄色"); Mouse mouse1 = new Mouse("米奇1", "黑色", cat);
cat.CatCome+=mouse1.RunAway; //向CatCome委托注册 Mouse mouse2 = new Mouse("米奇2", "白色", cat);
cat.CatCome+=mouse1.RunAway; //向CatCome委托注册
cat.CatComing();
Console.ReadKey();
}
运行结果如下
我们对上述代码进行优化,把注册事件放到类中,避免main()方法中太多重复的代码
public Mouse(string name,string color,Cat cat) { this.name = name; this.color = color; cat.CatCome += this.RunAway; //把自身的逃跑方法注册到猫的委托里 }
这样也可实现上述功能。
而事件就是委托的一个特例
其就是在委托前面加上event关键字:
public event Action CatCome; //声明一个猫来了的事件
区别在于委托可以在类的外部进行调用,而事件不能在类的外部直接调用
如下代码,委托调用是正确的(不会报错)的(不建议这种做法)
Cat cat = new Cat("加菲猫", "黄色"); Mouse mouse1 = new Mouse("米奇1", "黑色", cat); Mouse mouse2 = new Mouse("米奇2", "白色", cat); cat.CatComing(); cat.CatCome(); Console.ReadKey();
这是会显示两次结果。
而事件调用就是出错的
Cat cat = new Cat("加菲猫", "黄色"); Mouse mouse1 = new Mouse("米奇1", "黑色", cat); Mouse mouse2 = new Mouse("米奇2", "白色", cat); cat.CatComing(); cat.CatCome(); 这里会报错,因为事件不允许在类的外部被直接触发,只能在类的内部适时的时机触发。委托不一样,委托可以在 //类的外部触发(但是不要轻易使用),使用中,委托常用来表达可调,事件表达外发的接口。 Console.ReadKey();
错误反馈是这样的:
以后了解了新知识继续更本博文。