委托与lambda关系

什么是委托委托是没有方法体的,声明委托就是一个关键字: delegate ,委托能够试有参无参,有返回值无返回值。和咱们的方法是同样的。不一样的区别是 委托没有方法体的,委托可放在类下也能够放在类的外面和类同等级。委托能够说是一个类型。api

委托的声明: 学习

//声明委托:
    public delegate int Parameter(int Para);
    public delegate void NoParameter();
    public class Commondelegate
    {
        //声明委托:
        public delegate int Parameter(int Para);
        public delegate void NoParameter();
}

委托的实例化:spa

咱们能够把委托看做一个帮工每一个帮工都有各自的特长,这个帮工当你不告诉他要作什么的时候,他就不知道要作点什么,可是你使用他了,你就必需要指定他去作什么。不指定他去作什么然你就白花钱了,由于没有出活,帮工白请了。放到程序里就是报错了。委托是一个类也能够被实例化,他在实例化的时候须要给定参数。这个参数就是对应的方法。code

  //委托实例化
  NoParameter noParameter = new NoParameter(Program.NoParameter);
  Parameter parameter =  new  Parameter(Program.Parameter);
  
  /// <summary>
  /// 无参无返回值方法
  /// </summary>
  public static void NoParameter()
  {
  }
  /// <summary>
  /// 有参有返回值方法
  /// </summary>
  /// <param name="Para"></param>
  /// <returns></returns>
  public static int Parameter(int Para)
  {
      return Para;
  }

上面的代码中:咱们能够看到,委托的实例化目的就是为了调用某一个方法。可是咱们这样写的话,每使用一个相同的方法(注:参数相同,返回值相同,方法名不一样的方法,也就是声明委托时委托的类型)都须要去事先建立这样的一个方法。这样会又不少冗余的代码出现。blog

咱们换一种方法来实现上面的代码:get

  //委托实例化去执行方法:
    NoParameter noParameterNew = new NoParameter(
        delegate ()
        {
            Console.WriteLine("我是:无参无返回值方法");
        }
    );
    Parameter parameterNew = new Parameter(
         delegate (int Para)
         {
             Console.WriteLine("我是:有参有返回值方法");
             return Para;
         }
   );

上面的代码实现了一样的结果:这其实就是委托了一个匿名方法去实现了功能。可是这种写法不少老前辈在工做的时候会写过,由于这多是在Net 1.0/2.0的时候版本升级前的写法,后来出现了lambda 表达式,代码是这样写的。it

  //使用lambda 表达式
   NoParameter noParameterNew1 = new NoParameter(
        () =>
       {
           Console.WriteLine("我是:无参无返回值方法");
       }
   );

   Parameter parameterNew1 = new Parameter(
         (int Para) =>
        {
            Console.WriteLine("我是:有参有返回值方法");
            return Para;
        }
  );

上面的代码中使用 => // gose to  代替了delegate 这个时候咱们看到 => 的时候就很熟悉了lambda 是咱们常常会使用的. 其实lambda 更是一个匿名方法。咱们还能够进化一下,当方法体只有一行的时候能够这样写。io

咱们再换一种实现方式:class

   //使用lambda 表达式
     NoParameter noParameterNew1 = new NoParameter(
          () => Console.WriteLine("我是:无参无返回值方法")
     );

     Parameter parameterNew1 = new Parameter(
           (Para) => Para  
    );

上面的代码 中执行有参数的时候咱们能够看到咱们的参数并无去声明参数类型,委托会自动帮咱们去推算了。lambda

其实咱们还能够去这样写。

 //使用lambda 表达式
NoParameter noParameterNew1 =() => Console.WriteLine("我是:无参无返回值方法");
Parameter parameterNew1 =  (Para) => Para;
Parameter parameterNew2 = Para => Para; 

上面的代码咱们在看的时候,就愈来愈熟悉了,第一眼看过去你就会觉得是lambda吧,其实=号后面的代码是lambda,前面的仍是委托的实例。其实咱们大多数状况下是能够不用去声明委托的,系统已经给咱们准备好了两个方法供咱们使用:

 Action;  无返回值委托最多可接收参数 16 个

 Func;    有返回值委托,最多可接收参数16个 外加一个返回值参数。

https://docs.microsoft.com/en-us/dotnet/api/system.action?redirectedfrom=MSDN&view=netframework-4.7.2 官方的链接有详细的介绍。

上面的代码很简单,没有去深刻的去说一些东西。

有不足之处 但愿你们指出相互学习,

            本文原创:转载请注明出处 谢谢!

相关文章
相关标签/搜索