首先要知道什么是委托。用通俗易懂的话来讲,可以把委托看成是用来执行方法(函数)的一个容器。在使用委托时,可以像对待一个类一样对待它。即先声明,再实例化。两者只有一点不同,类在实例化之后叫对象或实例,但委托在实例化之后仍叫委托。如:
delegate double MathsOp(double x);
以上声明了一个委托,该委托的意义是任何一个返回值为double且只有一个形象为double 的函数都可以用这个委托来调用。要将委托实例化。首先要有一个满足委托声明的方法。假设有如下的返回一个数的2倍的方法:
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 MydelegateSpace
{
delegate double MathsOp(double x);
class Start
{
public class MyDelegate
{
public static double MultiplyBy2(double x)
{
return x*2;
}
}
}
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();
}
}
运行结果为:
1.23 multiply by 2 is 2.46
多路广播委托
前面使用的委托只包含一个方法调用。调用委托的次数与调用方法的次数相同。如果要调用多个方法,就需要多次显示调用这个委托。其实委托也可以包含多个方法,这种委托就是多路广播委托。多路广播委托派生于System.MulticastDelegate,它的Combine方法允许把多个方法调用在一起,可以通过+=来向委托添加调用方法,也可以用-=删除其中的调用方法。如:
namespcae MydelegateSpace
{
public class MyDelegate
{
public static void MultiplyBy2(double value)
{
double result=value*2;
Console.WriteLine("Multiplying by 2:{0} gives{1}",value,result);
}
public sttaic void Squre(double value)
{
double result =value*value;
Console.WriteLine("Squreing:{0}geves{1}",value,result);
}
}
delegate void MathsOp(doube x);
class Start
{
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.23gives 2.46
Squaring:1.23 gives 1.5129
Squaring:1.23 gives 1.5129
注意:多路广播委托声明时必须返回void ,否则返回值不知道应该送他到什么地方。
为什么要用委托呢?使用委托是程序猿可以将方法引用封装在委托对象内。然后可以将委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中函数的指针不同,委托是面向对象,而且是类型安全的。