委託、匿名方法到lambda表示式
阿新 • • 發佈:2020-07-25
在專案中我們經常會接觸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