1. 程式人生 > >委托與lambda關系

委托與lambda關系

nbsp 不知道 ted framework param 2.0 準備 redirect 原創

什麽是委托委托是沒有方法體的,聲明委托就是一個關鍵字: delegate ,委托可以試有參無參,有返回值無返回值。和我們的方法是一樣的。不同的區別是 委托沒有方法體的,委托可放在類下也可以放在類的外面和類同等級。委托可以說是一個類型。

委托的聲明:

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

委托的實例化:

我們可以把委托看作一個幫工每個幫工都有各自的特長,這個幫工當你不告訴他要做什麽的時候,他就不知道要做點什麽,但是你使用他了,你就必須要指定他去做什麽。不指定他去做什麽然你就白花錢了,因為沒有出活,幫工白請了。放到程序裏就是報錯了。委托是一個類也可以被實例化,他在實例化的時候需要給定參數。這個參數就是對應的方法。

  //委托實例化
  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; }

上面的代碼中:我們可以看到,委托的實例化目的就是為了調用某一個方法。但是我們這樣寫的話,每使用一個相同的方法(註:參數相同,返回值相同,方法名不同的方法,也就是聲明委托時委托的類型)都需要去事先創建這樣的一個方法。這樣會又很多冗余的代碼出現。

我們換一種方法來實現上面的代碼:

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

上面的代碼實現了同樣的結果:這其實就是委托了一個匿名方法去實現了功能。但是這種寫法很多老前輩在工作的時候會寫過,因為這可能是在Net 1.0/2.0的時候版本升級前的寫法,後來出現了lambda 表達式,代碼是這樣寫的。

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

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

上面的代碼中使用 => // gose to 代替了delegate 這個時候我們看到 => 的時候就很熟悉了lambda 是我們經常會使用的. 其實lambda 更是一個匿名方法。我們還可以進化一下,當方法體只有一行的時候可以這樣寫。

我們再換一種實現方式:

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

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

上面的代碼 中執行有參數的時候我們可以看到我們的參數並沒有去聲明參數類型,委托會自動幫我們去推算了。

其實我們還可以去這樣寫。

 //使用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 官方的連接有詳細的介紹。

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

有不足之處 希望大家指出相互學習,

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

委托與lambda關系