委托和事件
委托(delegate)是一种特殊的引用类型,它将方法作为特殊的对象封装起来,从而将方法作为变量或者参数进行传递。
1 //定义一个委托类型DelType。注意delegate关键字后要说明委托的返回类型和参数类型 2 public delegate void DelType(double x, double y); 3 //创建DelType委托类型的一个实例deltpe 4 DelType deltp; 5 //将指定的方法封装到该委托对象中,注意该方法的参数列表和返回类型都必须和委托的定义保持一致 6 deltp=new DelType(Sub);//c#还允许 DelType deltp=Sub
7 //最后通过委托对象来调用指定的方法 8 deltp(a,b);
委托调用静态方法、非静态方法:
- 调用当前类的静态方法--在创建表达式中只需写出方法名;
DelType deltp=new DelType(Sub); - 调用外部类型的静态方法--应该写出方法所属的类型;
DelType deltp=new DelType(Program.Sub); - 调用非静态方法--应该指出方法所属的对象名;
DelType deltp=new DelType(pro.Sub);
委托的加减运算:
一个委托对象可以封装多个方法,通过委托对象的相加(合并)来实现。
DelType deltp1=new DelType(Sub);
DelType deltp2=new DelType(Mul);
DelType deltp3=deltp1+deltp2;
委托的合并还可以使用复合赋值操作符
DeType deltp=Mul;
deltp+=Div;
委托的删除
deltp3-deltp3-deltp2;
参加加减运算的委托对象必须属于同一个委托类型,另一层含义就是参与合并或删除额方法的参数和返回类型必需完全一致。
如果委托对象全部删除之后,最后得到的是一个空的委托对象null,通过其进行方法调用会引发程序异常。
Delegate类型
C#中定义的所有的委托类型实际上都是.NET类库中Delegate类的派生类。不过Delegate类是抽象类,不能创建实例;而且C#编译器不允许显式定义Delegate的派生类,而是必须通过Delegate关键字来创建委托类型。
Delegate的几个成员方法:
DynamicInvoke:调用委托对象所封装的方法;它使用的是一个params object[]类型的数组型参数,因此无论将什么参数传递给该方法都能通过编译,但运行时可能发生错误。
GetInvokationList:返回一个Delegate[]数组,通过它可以得到所包含的委托对象列表。
事件处理
public event DelType deltp;
使用event关键字实现事件可靠的订阅发布。
使用EventHandler类
在事件发布和订阅的过程中,定义事件的原型委托类型常常是一件重复性的工作。为此,.NET类库中定义一个EventHandler委托类型。该委托的定义为:
public delegate void EventHandler(object sender,EventArgs e);
其中object类型的参数sender表示引发事件的对象。由于事件类型成员只能由类型本身触发,因此在触发时传递给该参数的值通常为this。
第二个参数e表示事件中包含的数据。