一、 "Lambda 表達式"(lambda expression)是一個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Lambda表達式可以表示閉包(註意和數學傳統意義上的不同)。 ...
一、 "Lambda 表達式"(lambda expression)是一個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Lambda表達式可以表示閉包(註意和數學傳統意義上的不同)。
二、下麵代碼演示怎麼從一個匿名函數(方法) 推導出一個Lambda表達式:
1.首先通過一個匿名方法來創建委托實例,傳入一個方法作為變數:

public void Test() { Func<string, string> funcToUpper; //定義一個委托實例,輸入參數、返回值都是string類型 funcToUpper = Upper; //傳入一個方法變數 Console.WriteLine(funcToUpper("lxsh")); } public string Upper(string str) { return str.ToUpper(); }View Code
2.Upper可以轉化一個匿名方法,針對方法體只有一行或者幾行的,為了方便代碼可閱讀性,不建議單獨維護一個方法,只需做一個匿名方法既可以

public void Test() { Func<string, string> funcToUpper; //定義一個委托實例,輸入參數、返回值都是string類型 //funcToUpper = Upper; //傳入一個方法變數 funcToUpper = delegate (string str){return str.ToUpper();}; Console.WriteLine(funcToUpper("lxsh")); }View Code
3.在C#3.0語法中出現了"=>"(goes to)語法糖,他可以替換匿名方法;該語法就是Lambda 表達式,

public void Test() { Func<string, string> funcToUpper; //定義一個委托實例,輸入參數、返回值都是string類型 //funcToUpper = Upper; //傳入一個方法變數 // funcToUpper = delegate (string str){return str.ToUpper();}; //匿名方法 funcToUpper = (string str)=>{return str.ToUpper();}; Console.WriteLine(funcToUpper("lxsh")); }View Code
4.到第三步為止Lambda 表達式其實看起來和匿名方法一樣,然並沒有節省多大空間,或並沒有增加代碼的可讀性,下麵講一下Lambda 表達式的快捷語法,
第一個快捷語法:以省略參數類型,因為定義委托的時候已經設置好了參數類型,它可以自動推算參數類型;且當只有一個參數的時候可以去掉小括弧,

public void Test() { Func<string, string> funcToUpper; //定義一個委托實例,輸入參數、返回值都是string類型 //funcToUpper = Upper; //傳入一個方法變數 //funcToUpper = delegate (string str){return str.ToUpper();}; //匿名方法 //funcToUpper = (string str)=>{return str.ToUpper();}; funcToUpper = str=>{return str.ToUpper();}; Console.WriteLine(funcToUpper("lxsh")); }View Code
第二快捷語法:當方法體只有一行時可以去掉大括弧,且如果有返回值可以去掉return

public void Test() { Func<string, string> funcToUpper; //定義一個委托實例,輸入參數、返回值都是string類型 //funcToUpper = Upper; //傳入一個方法變數 //funcToUpper = delegate (string str){return str.ToUpper();}; //匿名方法 //funcToUpper = (string str)=>{return str.ToUpper();}; // funcToUpper = str=>{return str.ToUpper();}; funcToUpper = str=> str.ToUpper(); Console.WriteLine(funcToUpper("lxsh")); }View Code
5.從匿名方法到Lambda 表達式完整的演變過程如下: