在C#中,所谓event事件,就是一种特殊的委托。如果要声明事件,首先就要声明一个相对应的委托类型。按照流程来说,事件相当于委托类型往上升了一级似的,我是这样认为的。
//1.先声明委托类型 public delegate void MethodDel(string param); //2.再次声明事件 public event MethodDel DoEvent;
event事件是一种特殊的多播委托,它可以用+=来新增方法引用,也可以用-=移除方法引用。
//用lambda表达式 附加 p.DoEvent += param => { Console.WriteLine(param); }; //用匿名函数 附加 p.DoEvent += delegate(string param) { Console.WriteLine(param); }; //用自定义方法 附加 p.DoEvent += Print; //移除Print方法 p.DoEvent -= Print; public static void Print(string param) { Console.WriteLine(param); }
在用匿名函数或lambda表达式附加方法的时候,如果后面有逻辑需要移除这些方法,在起始附加的时候,就要用委托变量去装载这些方法。
在使用event事件的时候,它给我的一个非常深的印象就是层层调用或引用。本来从A点可以直线的方式奔到B点,但是有了事件,可以从A点奔到C点,C点奔到D点,再从D点奔到B点,,转了一大圈,最后费了大把气力,终于引用到了需要被调用的方法。而传到该方法的参数,在中途已经被折腾过N遍,该方法可以直接获取这些参数的值。
事件是个好东西,它可以将外部自定义的方法引入到其他已经被封装好的方法中,而这些被封装好的方法可以不用去管你外部自定义方法的实现过程,它也没精力去管。
public void Show(string param) { OnDoEvent(param); } //调用事件 protected virtual void OnDoEvent(string param) { if(DoEvent != null) { DoEvent(param); } } //--------------------------------- //用自定义方法 附加 p.DoEvent += Print; p.Show("parameter");