13委托和事件
1、委托是什么?
委托是一种数据类型,像类一样(可以声明委托类型变量)。方法参数可以是 int、string、类类型
void M1(int n){ } √
void M2(string s){ } √
void M3(Person p){ } √
那么能不能把方法也作为参数进行传递?
委托就是一种数据类型,用来存放方法的了数据类型
委托的声明方式:delegate 返回值类型 委托的名(参数)
存储什么样的方法就声明什么类型(方法参数与返回值)的委托。
声明的委托是一种类型,就像int、Person一样,如果要用的话还要声明委托类型的变量,声明委托类型的方式: Mydel f1;
将委托类型变量指向函数 Mydel sp = new Mydel (SayHello) ,这样就可以像调用普通函数一样把 sp 当函数用了。委托可以看作是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向他,函数也可以用委托变量指向它。
和直接调用函数的区别:用委托就可以指向任意函数,哪怕是之前没定义的都可以,而不适用受限于那几种。
将委托类型变量指向函数还可以简化成 Mydel sp = SayHello ,编译器帮我们进行了 new 。但是不能 sp = PrintIt() ,因为这样就成了函数调用;
2、匿名方法
1、使用 Delegate 的时候很多时候没必要使用一个普通的方法,因为这个方法只有 Delegate 会用,并且只用一次,这是使用匿名方法最合适
2、匿名方法就死没有名字的方法。(整数 3 就是没有名字的 int 对象。3+5 就是两个匿名 int 对象的相加,允许匿名对象,就允许匿名方法)
ProcessWordDelegate p = delegate(string s) { Console.WriteLine( string s ); };
匿名方法与 lambda 表达式最终编译为一个方法
3、多播委托
- 委托绑定多个方法后,其中一个方法执行发生异常,后面的方法不会继续执行
- 组合的委托必须是同一个类型
- 相当于创建了一个按照组合顺序一次调用的新委托对象
- 委托的组合一般是给事件用的,用普通的委托的时候很少用
4、事件(通过委托实现的,委托才是事件正常执行的核心内容)
事件语法: event ProcessWordDelegate
加了event关键字实现事件机制的好处:用了event事件,不可以修改事件已经注册的值;不可以冒充进行事件通知了。
5、委托和事件的区别
委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为第委托变量的封装。)
下面说的是委托的对象(用委托方式实现的事件) 和 (标准的 event 方式实现) 事件的区别。
事件的内部是用委托实现的。
对于事件来说,外部只能 “注册自己 += 、 注销自己 -=“ ,外界不可以注销其它的注册者,外界不可以主动触发事件,因为如果用Delegate就没法进行上面的控制,因此但是了事件这种语法。 add、remove
事件是用来阉割委托实例的。事件只能 add 、 remove 自己,不能赋值。
事件只能 += 、-= ,不能 = 、不能外部触发事件
6、委托与事件总结
委托的作用:
占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为 null。
事件的作用:
事件的作用与委托一样,只是功能上比委托变量有更多的限制。
比如:
1、只能通过 += 或 -= 来绑定方法(事件处理程序)
2、只能在类内部调用(触发)事件
在自定义控件(自己编写控件的时候,会大量用到。编写控件的时候,会写一些事件。但是当这些事件被触发以后,具体执行的那些事件处理程序是编写控件的人没法确定的。这个时候只能通过事件来占位(调用),个体调用的是哪个方法,由使用控件的人来决定(Click+=new 委托(方法名);))