委托

首先要知道什么是委托。用通俗易懂的话来讲,可以把委托看成是用来执行方法(函数)的一个容器。在使用委托时,可以像对待一个类一样对待它。即先声明,再实例化。两者只有一点不同,类在实例化之后叫对象或实例,但委托在实例化之后仍叫委托。如:

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++中函数的指针不同,委托是面向对象,而且是类型安全的。

原文地址:https://www.cnblogs.com/yk1992/p/3587591.html