1. 程式人生 > >委託、匿名方法到lambda表示式

委託、匿名方法到lambda表示式

在專案中我們經常會接觸lambda表示式,操作簡潔明瞭。幫我們省了不少事。面對這麼神奇的一個東西,是不是也應該瞭解瞭解它的本質呢。

今天我們通過一步一步的演變揭開lambda表示式的本質 

一.委託

C# 中的委託類似於 C 或 C++ 中函式的指標。委託是存有對某個方法的引用的一種引用型別變數。引用可在執行時被改變。委託的本質也跟類一樣,是使用者自定義的型別。類的定義是通過class關鍵字

,而委託的定義是通過delegate來定義

    class Program
    {
        static void Main(string[] args)
        {
            //宣告一個AddNum型別的變數a,
            AddNum a = new AddNum(Add);   //建立一個指向Add方法的委託物件
            a(2, 3); //呼叫a指向的方法
            Console.WriteLine(a);  //列印a的型別,a(2,3)加上括號才是呼叫
            Console.WriteLine(a(2, 3));
        }
        //宣告一個方法以便委託呼叫,要注意的是方法的簽名要與委託宣告的簽名保持一致
        public static int Add(int a,int b)
        {
            return a + b;
        }
    }
    //宣告一個委託,要注意的是委託跟類是同一級別的
    delegate int AddNum(int a, int b);

二.匿名方法

匿名方法,顧名思義就是沒有名字的方法,通常我們呼叫方法就是根據方法的名字進行呼叫,那這匿名方法沒有名字我們該如何呼叫嘞。彆著急,我們可以通過匿名方法實現委託例項來進行呼叫

        AddNum c = new AddNum(Add); //傳統的做法,先通過建立Add方法再建立委託例項
            //使用匿名方法建立委託例項
            AddNum b = delegate (int m, int n)
              {
                  return m + n;
              };
            Console.WriteLine(b(6,6));  //委託的呼叫還是一樣的

三.lambda表示式

lambda是一個匿名方法,C#中的Lambda 表示式都使用 Lambda 運算子 =>,該運算子讀為“goes to”

         //匿名方法宣告委託
            AddNum b = delegate (int m, int n){ return m + n; };
            //lambda格式的匿名方法的寫法
            AddNum c = (int m, int n)=>{ return m + n; };

            //演變一:可以省略資料型別(編譯器可以根據委託型別自動推斷)
            AddNum d = (m,n) => { return m + n; };
            //演變二:當匿名方法只用一個引數,小括號也可以省略
            Func<int, bool> e = i => { return true; };   //Func為內建的委託物件,最後一個引數是返回值的型別
            //演變三:若委託有返回值,並且方法體只有一行程式碼,則大括號和return都可以省略
            AddNum f = (m, n) => m + n;

&n