什么是委托?
首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。
如何使用委托?
在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。
声明,如:
namespace Vczx.ProCSharp.Exc
{
delegate double MathsOp( double x );
//class defination here
}
这就声明了一个委托,意义:任何一个返回值为double,且只有一个形参为double的函数,都可以用这个委托来调用。
class MathsOperations
{
public static double MultiplyBy2( double value )
{
return value * 2;
}
}
有了这样一个方法,我们就可以实例化一个委托了:
MathsOp operation = new MathsOp( MathsOperations.MultiplyBy2 );
在实例化一个委托时,要给它一个参数,这个参数就是委托执行的方法,它可以是静态方法,也可以是实例方法(这一点有别于函数指针,函数指针只能调用静态方法),如:
MathsOp operation = new MathsOp( new Class1().Method1 );
在实例化完一个委托之后,就可以用这个委托来调用方法了:
double result = operation( 1.23 );
例子代码:
namespace Vczx.ProCSharp.Exc
{
delegate double MathsOp( double x );
class Start
{
public class MyDelegate
{
public static double MultiplyBy2( double x )
{
return x * 2;
}
}
[STAThread]
static void Main(string[] args)
{
MathsOp operation = new MathsOp( MyDelegate.MultiplyBy2 );
double x = 1.23;
double result = operation( x );
Console.WriteLine( "{0} multiply by 2 is {1}", x, result );
Console.Read();
}
}
}
多路广播委托
namespace Vczx.ProCSharp.Exc
{
public class MyDelegate
{
public static void MultiplyBy2( double value )
{
double result = value * 2;
Console.WriteLine( "Multiplying by 2: {0} gives {1}", value, result );
}
public static void Squre( double value )
{
double result = value * value;
Console.WriteLine( "Squaring: {0} gives {1}", value, result );
}
}
delegate void MathsOp( double x );
class Start
{
[STAThread]
static void Main(string[] args)
{
MathsOp operation = new MathsOp( MyDelegate.MultiplyBy2 );
operation += new MathsOp( MyDelegate.Squre );
double x = 1.23;
operation( x );
operation -= new MathsOp( MyDelegate.MultiplyBy2 );
operation( x );
Console.Read();
}
}
}
输出:
Multiplying by 2: 1.23 gives 2.46
Squaring: 1.23 gives 1.5129
Squaring: 1.23 gives 1.5129
注意,多路广播委托声明时必须返回void,否则返回值不知道应该送回什么地方。对此,我做了一个测试:如果不将委托的声明返回void,则返回值返回的是最后一个链入委托链的方法的返回值,编译不会出错。