zoukankan      html  css  js  c++  java
  • 委托

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

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

  • 相关阅读:
    How to disable ipv6 in ubuntu
    git 暂存区问题
    linux 自动输入密码脚本避免密码确认
    【Linux学习简记 】数据流重定向<,<<,>,>>,2>,2>>
    【Gradle教程】Gradle 基础入门
    vsftpd配置匿名下载,登录上传
    Thunar左侧边栏不完全显示PLACES的解决
    【Jenkins系列教程】流水线通过SSH方式操作Git仓库
    害你加班的bug就是我写的,记一次升级Jenkins插件引发的加班
    Linux 临时终端连接无线网
  • 原文地址:https://www.cnblogs.com/yk1992/p/3587591.html
Copyright © 2011-2022 走看看