Lambda簡化C#編程學(xué)習(xí)心得
下邊是我學(xué)Lambda表達式的一點記錄。
1、Lambda表達式是與委托緊密聯(lián)系的。只要有委托參數(shù)類型的地方,就可以使用Lambda表達式。
Lambda表達式的運算符是=>。運算符左邊列舉出了需要的參數(shù),右邊定義了賦予Lambda變量的方法的實現(xiàn)代碼。下面這段代碼是一個最簡單的使用方法
- public class MyLambda{ public void disPlay()
- { string mid = ",middle part,";
- Func<string, string> lambda = param =>
- { param += mid; param
- += "and this was added to the string";
- return param; }; Console.WriteLine
- (lambda("Start of string")); }}
Func<string, string>是一個委托類型。包含兩個參數(shù):一個輸入的string和一個輸出的string.
parm是輸入?yún)?shù),所以他的類型可以認為是string類型的(當然很多地方會出現(xiàn)沒有名字的類型的)。
運算符=>右邊表示一個方法,這個方法沒有名字。這個方法賦予了變量lambda。
在本例中,通過Console.WriteLine(lambda("Start of string"));向lambda方法傳遞參數(shù)“Start of string”.經(jīng)處理后會有這樣的輸出:
Start of string,middle part,and this was added to the string。
所以我想這樣理解:Lambda表達式表示是一個函數(shù)的另一種寫法。運算符=>左邊是輸入,右邊是函數(shù)體。函數(shù)體需不需要返回值,由接收這個函數(shù)定義的lambda表達式的委托決定。
2、Lambda表達式的參數(shù)。
lambda表達式如果只有一個參數(shù),只寫出參數(shù)名就行了。下邊的lambda表達式使用了參數(shù)s,因為委托類型定義了一個string類型。所以s的類型就是string。實現(xiàn)函數(shù)體的代碼調(diào)用了String.Format()方法返回一個字符串,在調(diào)用委托是就直接把字符串輸出了:
- Func<string, string> oneParam = s => { return
- String.Format("Change To UpperCase {0}", s.ToUpper
- ()); };
- Console.WriteLine( oneParam("abc"));
注:Func<string,string>是一個系統(tǒng)定義的帶有一個輸入和一個輸出的委托。
如果委托有多個參數(shù),就要把參數(shù)放到括號中,如下:
- Func<double, double, double> twoParam = (x, y) =>
- { return x * y; };
3、單行代碼和多行代碼
如果Lambda表達式只有一條語句,在方法塊內(nèi)就不需要花括號和return語句了,編譯器會自動添加一條隱式的return語句。如上邊的兩個表達式可以分別表示為:
- Func<string, string> oneParam = s => String.Format
- ("Change To UpperCase {0}", s.ToUpper());Func<double,
- double, double> twoParam = (x, y) => x * y;
但是如果Lambda表達式實現(xiàn)代碼需要多條語句時,就必須添加花括號和return語句了。如***個例子的代碼。
4、Lambda表達式的外部變量
Lambda表達式可以使用外部變量。但使用時應(yīng)該注意些問題:
先看下邊的代碼:
- int someVar = 5;Func<int, int> f = x => x +
- someVar;someVar = 10;Console.WriteLine(f(5));
輸出應(yīng)該是x+5還是x+10呢?運行下發(fā)現(xiàn)輸出15(x+10).即修改外部變量someVar后,會使用外部變量的新值。
對于表達式x => x + someVar; 編譯器會創(chuàng)建一個匿名類,他有一個構(gòu)造函數(shù)來傳遞外部變量。該構(gòu)造函數(shù)取決于從外部傳遞過來的變量個數(shù)。對于上邊這個例子,我們可以認為構(gòu)造函數(shù)接受一個int,匿名類包含了一個匿名方法,其實現(xiàn)代碼和返回類型有l(wèi)ambda表達式定義:
- public class AnonymousClass{ private int someVar;
- public AnonymousClass(int someVar) {
- this.someVar = someVar; } public int
- AnonymousMethod(int x) { return x +
- someVar; }}
使用Lambda表達式時,調(diào)用該方法(AnonymousMethod(int x)),會創(chuàng)建匿名類的一個實例(相當于new AnonymousClass(somevar)),并傳遞調(diào)用該方法時的變量的值。
Lambda簡化C#編程學(xué)習(xí)心得就先寫到這里了,希望對大家有幫助。
【編輯推薦】