事件和委托有相似的地方,但有本质的区别,事件是对象,而委托是类型。
而联系在于,事件是在委托的实例上“创造”出来的,格式为:
event 委托类型 事件名;例如event Action ac;
可以看到事件是通过委托的实例,在其前面加上event关键字创建的。
实质:事件是private私有委托,外部只能“+=”注册事件(add方法),“—=”注销事件(remove方法)。同时因为是私有的,所以是不能执行事件的,也弥补了委托能赋值NULL覆盖所有注册的方法。
public Action demoEvent; public void Add(Action a) { demoEvent+=a; } public void Remove(Action a) { demoEvent-=a; }
public class demoEvent { public event Action myEvent; //执行注册好的函数 public void doEvent() { if (myEvent != null)//判断事件是否为NULL { myEvent(); } } demoEvent f = new demoEvent(); f.myEvent += () => { MessageBox.Show("fdfds"); }; //执行注册好的函数 f.doEvent();
上面的代码简单的概述了事件的执行过程,但注册好的事件是需要去执行的。
所以还需要一个方法去判断事件是否为空,不为空才会执行相应的方法。
但这里有一个疑问,拿Button为例,在代码中是可以看见注册事件的代码和对应的方法,
但是如何执行的,按猜想是在按下的时候执行了什么函数去判断事件是否被注册的功能。