一、委托
委托:把方法传递给其他方法,这个方法可以是静态方法。当一个方法在执行的时候,无法确定其执行细节的时候可以使用委托。如,以通用的数组排序方法,当执行的时候无法确定数组元素的类型,从而无法对其进行比较;这时可以把对数据元素进行比较的方法定义为委托,这样就可以完成这个通用的数组排序方法。
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执行完事件的一些信,这时就体现了“事件可以在应用程序中传递信息”。