什么是委托
首先要知道什么是委托用最通俗易懂的话来讲你就可以把委托看成是用来执行方法(函数)的一个东西
如何使用委托
在使用委托的时候你可以像对待一个类一样对待它即先声明再实例化只是有点不同类在实例化之后叫对象或实例但委托在实例化后仍叫委托
声明如
namespace VczxProCSharpExc
{
delegate double MathsOp( double x )
//class defination here
}
这就声明了一个委托意义任何一个返回值为double且只有一个形参为double的函数都可以用这个委托来调用
注意委托的声明位置在namespace里面类的外面其实委托的声明也可以在类的里面甚至是任何一个可以声明类的地方
实例化
首先我们要先有一个满足委托声明的方法假设一个返回一个数的倍的方法
class MathsOperations
{
public static double MultiplyBy( double value )
{
return value *
}
}
有了这样一个方法我们就可以实例化一个委托了
MathsOp operation = new MathsOp( MathsOperationsMultiplyBy )
在实例化一个委托时要给它一个参数这个参数就是委托执行的方法它可以是静态方法也可以是实例方法(这一点有别于函数指针函数指针只能调用静态方法)如
MathsOp operation = new MathsOp( new Class()Method )
在实例化完一个委托之后就可以用这个委托来调用方法了
double result = operation( )
例子代码
namespace VczxProCSharpExc
{
delegate double MathsOp( double x )
class Start
{
public class MyDelegate
{
public static double MultiplyBy( double x )
{
return x *
}
}
[STAThread]
static void Main(string[] args)
{
MathsOp operation = new MathsOp( MyDelegateMultiplyBy )
double x =
double result = operation( x )
ConsoleWriteLine( {} multiply by is {} x result )
ConsoleRead()
}
}
}
多路广播委托
前面使用的委托只包含一个方法调用调用委托的次数与调用方法的次数相同如果要调用多个方法就需要多次显示调用这个委托其实委托也可以包含多个方法这种委托就是多路广播委托多路广播委托派生于SystemMulticastDelegate它的Combine方法允许把多个方法调用链接在一起我们可以通过+=来向委托添加调用方法也可以用=删除其中的调用方法如
namespace VczxProCSharpExc
{
public class MyDelegate
{
public static void MultiplyBy( double value )
{
double result = value *
ConsoleWriteLine( Multiplying by {} gives {} value result )
}
public static void Squre( double value )
{
double result = value * value
ConsoleWriteLine( Squaring {} gives {} value result )
}
}
delegate void MathsOp( double x )
class Start
{
[STAThread]
static void Main(string[] args)
{
MathsOp operation = new MathsOp( MyDelegateMultiplyBy )
operation += new MathsOp( MyDelegateSqure )
double x =
operation( x )
operation = new MathsOp( MyDelegateMultiplyBy )
operation( x )
ConsoleRead()
}
}
}
输出
Multiplying by gives
Squaring gives
Squaring gives
注意多路广播委托声明时必须返回void否则返回值不知道应该送回什么地方对此我做了一个测试如果不将委托的声明返回void则返回值返回的是最后一个链入委托链的方法的返回值编译不会出错
为什么要用委托
使用委托使程序员可以将方法引用封装在委托对象内然后可以将该委托对象传递给可调用所引用方法的代码而不必在编译时知道将调用哪个方法与C或C++中的函数指针不同委托是面向对象而且是类型安全的