委托、匿名方法、事件学习小结

来源:互联网 发布:东明知行劳务 编辑:程序博客网 时间:2024/04/30 05:36

 

一、委托

委托:把方法传递给其他方法,这个方法可以是静态方法。当一个方法在执行的时候,无法确定其执行细节的时候可以使用委托。如,以通用的数组排序方法,当执行的时候无法确定数组元素的类型,从而无法对其进行比较;这时可以把对数据元素进行比较的方法定义为委托,这样就可以完成这个通用的数组排序方法。

1. 委托数组:多个委托实例,执行多个方法;一个委托实例只能执行一个方法
 delegate double DoubleOp(double x)
  DoubleOp[] operations = {new DoubleOp(方法名), new DoubleOp(方法名)}
 operations[0](100)
2. 多波委托:一个委托实例一次执行多个不同的方法,但是执行的顺序不能确定
 delegate double DoubleOp(double x)
  DoubleOp operation1 = new DoubleOp(方法名)
  DoubleOp operation2 = new DoubleOp(方法名)
 DoubleOp operations = operation1 + operation2
 operations(100)

 delegate double DoubleOp(double x)
  DoubleOp operations = new DoubleOp(方法名)
  operations += new DoubleOp(方法名)
 operations(100)
 
 二、匿名方法

匿名方法:简化委托的实现,在要传递的方法比较简单时,不必定义方法,简化代码。
 delegate double DoubleOp(double x)
 DoubleOp operation1 = delegate(double x){return x * 2}
 DoubleOp operation2 = delegate(double x){return x * x}
 DoubleOp[] operations = {operation1, operation2}
 operations[0](100)

 匿名方法的特点:
1. 在匿名方法中不能使用跳转语句跳转到该匿名方法的外部,反之亦然
2. 在匿名方法中不能访问不安全的代码
3. 匿名方法中不能使用外部的ref和out参数,但可以使用匿名方法外部定义的其他变量

 

三、事件

事件:当一个对象发生了变化通知其他对象发行了什么变化,这种发式就是事件。事件是对象之间的通讯介质。委托是事件实现的方式。事件可以在应用程序中传递信息。


1) 事件包括如下概念:

1. 事件发送器:引发事件的对象,如鼠标按下, 日期大于某一天。事件发送器不知道事件接收器是谁。
2. 事件接收器: 发生某些事件时被通知的任何应用程序、对象或组件。也可以认为是事件处理程序。
3. 事件:一个定义好的委托,事件发送器与事件接收器之间的中介。
4. 注册(封装)事件:发送器定义接收器要使用的委托,接收器将事件处理程序注册到事件中,连接事件处理程序的过程称为封装事件。

 

2) .net 事件模型
1. EventHandler委托,无返回值,其参数为Object和EventArgs, EventArgs可以在发送器与接收器这间传递信息;自定义事件可以继承这些对象

 

3) 生成事件
1. 创建事件,即定义一个自定的事件
 public delegate void ActionEventHandler(object sender, ActionCancelEventArgs ev);
 public static event ActionEventHandler Action;
 (ActionCancelEventArgs类也需要创建, 命名与Action事件名对应)

2. 创建事件发送器
 protected void OnAction(object sender, ActionCancelEventArgs ev)
 {
  if (Action != null)
   Action(send, ev);
 }
 (事件引发时执行其对应的委托,命名与Action事件名对应)
3. 创建事件接收器(可以是某个窗口的一个事件)
 private void Form1_Action(object sender, ActionCancelEventArgs ev)
 {
  //do something
  //这里可以使用sender, ev的一些属性执行一些逻辑判断
 }
4. 注册事件
 Form1.Action += new Form1.ActionEventHandler(Form1_Action)


4) 完成一个自定义事件

场景是定一个自定义事件,给Form1注册这个事件,在时间大于当前日期是引发该事件,包括三部分:1.事件2.事件引发类3.事件执行类
 1. 事件
 public delegate void ActionEventHandler(object sender, ActionCancelEventArgs ev);(可以在命名空间中任意一处定义)
 public static event ActionEventHandler Action;(是在被注册事件类中定义,此处是在From1中定义)
 定义ActionCancelEventArgs类
 2. 事件引发类
 private void btnRaise_Click(object sender, EventArgs e)
 {
  ActionCancelEventArgs cancelEvent = new ActionCancelEventArgs();
  OnAction(this, cancelEvent);
  if (cancelEvent.Cancel)
   //......
  else
   //......
 }
 protected void OnAction(object sender, ActionCancelEventArgs ev)(是在被注册事件类中定义,此处是在From1中定义)
 {
  if (Action != null)
   Action(send, ev);
 }
 3.事件执行类
 Form1.Action += new Form1.ActionEventHandler(Form1_Action)
 private void Form1_Action(object sender, ActionCancelEventArgs ev)
 {
  //do something
  //这里可以使用sender, ev的一些属性执行一些逻辑判断
 }

如果给多个Form注册Action事件的话,激发事件后所有注册过该事件的Form都会去响应该事件。这时如果cancelEvent包括所有注册该事件Form的列表信息;在执行完所有事件响应后,就可以在btnRaise_Click方法中根据cancelEvent得到每个Form执行完事件的一些信,这时就体现了“事件可以在应用程序中传递信息”。