委託與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 官方的鏈接有詳細的介紹。

上面的代碼很簡單,沒有去深刻的去說一些東西。

有不足之處 但願你們指出相互學習,

            本文原創:轉載請註明出處 謝謝!

相關文章
相關標籤/搜索