c# lambda表達式詳解
Lambda表達式本質上就是匿名函數
使用lambda聲明運算符 =>(讀作goesto)的表達式就是Lambda表達式
創建Lambda表達式,需要在 Lambda 運算符左側指定輸入參數(如果有),然后在另一側輸入表達式或語句塊。
即是說我們使用形如 ()=> { } 這樣的格式就可以創建Lambda表達式
任何 Lambda 表達式都可以轉換為委托類型。 Lambda 表達式可以轉換的委托類型由其參數和返回值的類型定義。 如果 Lambda 表達式不返回值,則可以將其轉換為 Action 委托類型之一;否則,可將其轉換為 Func 委托類型之一。
1.Lambda表示式的兩種方式
表達式lambda,表達式為主體
(input-parameters) => expression
x => x * 4 //1個參數可省略括號
語句 lambda,語句塊作為其主體
(input-parameters) => { <sequence-of-statements> }
(int x) => { return x * 2; };
2 Lambda表達式的輸入參數
1)將 lambda 表達式的輸入參數括在括號中。 使用空括號指定零個輸入參數
如果是沒有參數,必須有這個空括號
Action line = () => Console.WriteLine();
2)如果 lambda 表達式只有一個輸入參數,則括號是可選的:
如果只有一個輸入參數,則括號可有可無
Func<double, double> cube = x => x * x * x;
3)兩個或更多輸入參數使用逗號加以分隔:
Func<int, int, bool> testForEquality = (x, y) => x == y;
4)有時,編譯器無法推斷輸入參數的類型。 可以顯式指定類型,如下面的示例所示:
一般情況下,編譯器可自行推斷輸入參數的類型,但存在編譯器無法推斷的情況,則需自行指定。
Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;
3.Lambda表達式的發展演變
————————————————
版權聲明:本文為CSDN博主「鯉籽鯤」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_39847278/article/details/127525222
使用lambda聲明運算符 =>(讀作goesto)的表達式就是Lambda表達式
創建Lambda表達式,需要在 Lambda 運算符左側指定輸入參數(如果有),然后在另一側輸入表達式或語句塊。
即是說我們使用形如 ()=> { } 這樣的格式就可以創建Lambda表達式
任何 Lambda 表達式都可以轉換為委托類型。 Lambda 表達式可以轉換的委托類型由其參數和返回值的類型定義。 如果 Lambda 表達式不返回值,則可以將其轉換為 Action 委托類型之一;否則,可將其轉換為 Func 委托類型之一。
1.Lambda表示式的兩種方式
表達式lambda,表達式為主體
(input-parameters) => expression
x => x * 4 //1個參數可省略括號
語句 lambda,語句塊作為其主體
(input-parameters) => { <sequence-of-statements> }
(int x) => { return x * 2; };
public class LambdaTest { public void Test() { //表達式lambda 只有一個表達式,表示這里面只允許有一行代碼 Func<int, int> func = x => x * 4; //接收表達式Lambda返回的值 int result1 = func(5); //在表達式lambda中調用方法 func = x => x * Add(3, 2); int result2 = func(5); } public int Add(int x,int y) { return x + y; } public void Test()
{ Action<int> action = (x) => { Console.WriteLine(x); }; action = (y) => { y *= 4; Console.WriteLine(y); }; } }
2 Lambda表達式的輸入參數
1)將 lambda 表達式的輸入參數括在括號中。 使用空括號指定零個輸入參數
如果是沒有參數,必須有這個空括號
Action line = () => Console.WriteLine();
2)如果 lambda 表達式只有一個輸入參數,則括號是可選的:
如果只有一個輸入參數,則括號可有可無
Func<double, double> cube = x => x * x * x;
3)兩個或更多輸入參數使用逗號加以分隔:
Func<int, int, bool> testForEquality = (x, y) => x == y;
4)有時,編譯器無法推斷輸入參數的類型。 可以顯式指定類型,如下面的示例所示:
一般情況下,編譯器可自行推斷輸入參數的類型,但存在編譯器無法推斷的情況,則需自行指定。
Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;
3.Lambda表達式的發展演變
public delegate void ShowDelegate(int a,string b); public class LambdaEvolution { public void Show(int a1,string b1) { Console.WriteLine($"show{a1}:{b1}"); } public void Test() { //1 .Netframework1.0/1.1,原始方法 ShowDelegate showDelegate = new ShowDelegate(Show); //2 .NetFramework2.0,匿名方法,增加delegate,去掉單獨定義方法 showDelegate = delegate (int x,string y) { Console.WriteLine($"show{x}:{y}"); }; //3 .NetFramework3.0,=> 引入Lambda表達式,去掉delegate showDelegate = (int s,string t) => { Console.WriteLine($"show{s}:{t}"); }; //4 .NetFramework3.0后期,簡化參數類型,編譯器自動推斷數據類型 showDelegate = (s,t) => { Console.WriteLine($"show{s}:{t}"); }; //5 如果方法體中只有一行代碼,可以省略方法體大括號 showDelegate = (s,t) => Console.WriteLine($"show{s}:{t}"); //如果方法只有一個參數,可以省略參數小括號 Action<string> action = x => Console.WriteLine($"show{x}"); //如果方法體中只有一行代碼,且有返回值,可以省略return Func<int, string> func = x => x.ToString(); } }
————————————————
版權聲明:本文為CSDN博主「鯉籽鯤」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_39847278/article/details/127525222

浙公網安備 33010602011771號