基本的自定义委托形式:
Public delegate void Delegate(){
}
委托是一种引用类型的类。类似cpp函数指针。委托的基础使用就是快速去间接调用某些方法。
C#system库自带委托:
Action 委托无返回值(void)
Func 委托必须有返回值。
委托的常用在作为参数传入某个方法,同时在委托里面间接调用其他方法。实现多方法的快速耦合。
缺点:
委托的多播会造成内存泄漏:委托会引用一个方法,如果这个方法是一个实例方法(非静态方法)的话,那么这个方法必须隶属于一个对象,拿一个委托引用这个方法,那么这个对象必须存在在内存中,即便没有其他引用变量引用这个对象了,这个对象的内存也不能被释放,因为一旦释放,内存就不能再间接调用对象的方法了。 Memory leak
多播委托同样在维护上存在一定的困难性,容易导致所有的方法重置,完全性降低。(使用事件来作为委托类型字段的封装器。)
嵌套调用可读性差
.NET规定,声明事件的委托的命名格式采用 事件名称加EventerHandle这一后缀命名。事件的命名要加上后缀EventArgs,自定义事件要继承自EventArgs。
事件的本质就是委托字段的包装器。
Public EventHandler onorder;这是一个委托类型的字段。
Public event EventHandler onorder ;这是一个事件,只能以-=或者+=访问事件,添加事件处理器的订阅和删除。简略的声明格式容易造成误导,实际上事件并非委托类型的字段或者特殊的委托类型,它是委托的包装器。
PS:判断事件是否为空可以使用!=(语法糖)。
完整声明格式:
Private EventHandler orderEventHandler;
Pubic event EventHandler Onorder{
add{
orderEventHandler+=value;
}
remove {
orderEventHandler-=value;
}
}
事件就是用来阉割委托实例的,事件只能add,remove事件处理器,不能赋值,并且事件只能+=,-=,不能=,不能外部触发事件。
在实际项目中,我们常常会利用事件来降低代码之间的耦合度,同时避免重复的编写多种较为通用的方法,减少工作量。
后记:算是个人对最近的唐山事件的感慨,希望大家能够将性别对立,女权,性骚扰,黑社会,暴力斗殴这些因素看得更加深刻一点,有自己的思考。希望这次事件中的受害人能够被大家关照,也希望不法分子能得到制裁,同时也始终希望广大的网友可以更加理智。