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、多播委托

 

  1. 委托绑定多个方法后,其中一个方法执行发生异常,后面的方法不会继续执行
  2. 组合的委托必须是同一个类型
  3. 相当于创建了一个按照组合顺序一次调用的新委托对象
  4. 委托的组合一般是给事件用的,用普通的委托的时候很少用

 

 

4、事件(通过委托实现的,委托才是事件正常执行的核心内容)

事件语法:        event ProcessWordDelegate

加了event关键字实现事件机制的好处:用了event事件,不可以修改事件已经注册的值;不可以冒充进行事件通知了。

 

5、委托和事件的区别

委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为第委托变量的封装。)

下面说的是委托的对象(用委托方式实现的事件) 和 (标准的 event 方式实现) 事件的区别。

事件的内部是用委托实现的。

 

对于事件来说,外部只能  “注册自己 +=   、  注销自己 -=“ ,外界不可以注销其它的注册者,外界不可以主动触发事件,因为如果用Delegate就没法进行上面的控制,因此但是了事件这种语法。  add、remove

事件是用来阉割委托实例的。事件只能 add 、 remove 自己,不能赋值。

事件只能 += 、-= ,不能 = 、不能外部触发事件

 

6、委托与事件总结

委托的作用:

占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为 null。

 

事件的作用:

事件的作用与委托一样,只是功能上比委托变量有更多的限制

比如:

    1、只能通过 += 或 -= 来绑定方法(事件处理程序)

    2、只能在类内部调用(触发)事件

 

在自定义控件(自己编写控件的时候,会大量用到。编写控件的时候,会写一些事件。但是当这些事件被触发以后,具体执行的那些事件处理程序是编写控件的人没法确定的。这个时候只能通过事件来占位(调用),个体调用的是哪个方法,由使用控件的人来决定(Click+=new  委托(方法名);))

 

 

 

 

 

 

 

 





你可能感兴趣的:(事件)