天天看點

C#的Lambda 表達式都使用 Lambda 運算符 =>,該運算符讀為“goes to”。文法如下:...

形參清單=>函數體 函數體多于一條語句的可用大括号括起。

類型

可以将此表達式配置設定給委托類型,如下所示:  

delegate int del(int i);
del myDelegate = x=>{return x*x;};
int j = myDelegate(5);//j=25      

建立表達式目錄樹類型:

using System.Linq.Expressions;
//...
Expression <del>=x=>x*x;      

=> 運算符具有與指派運算符 (=) 相同的優先級,并且是右結合運算符。 Lambda 用在基于方法的 LINQ 查詢中,作為諸如 Where 和 Where 等标準查詢運算符方法的參數。 使用基于方法的文法在 Enumerable 類中調用 Where 方法時(像在 LINQ to Objects 和 LINQ to XML 中那樣),參數是委托類型 System..::.Func<(Of <(T, TResult>)>)。使用 Lambda 表達式建立委托最為友善。例如,當您在 System.Linq..::.Queryable 類中調用相同的方法時(像在 LINQ to SQL 中那樣),則參數類型是 System.Linq.Expressions..::.Expression<Func>,其中 Func 是包含至多五個輸入參數的任何 Func 委托。同樣,Lambda 表達式隻是一種用于構造表達式目錄樹的非常簡練的方式。盡管事實上通過 Lambda 建立的對象的類型是不同的,但 Lambda 使得 Where 調用看起來類似。 在前面的示例中,請注意委托簽名具有一個 int 類型的隐式類型輸入參數,并傳回 int。可以将 Lambda 表達式轉換為該類型的委托,因為該表達式也具有一個輸入參數 (x),以及一個編譯器可隐式轉換為 int 類型的傳回值。(以下幾節中将對類型推理進行詳細讨論。)使用輸入參數 5 調用委托時,它将傳回結果 25。 在 is 或 as 運算符的左側不允許使用 Lambda。 适用于匿名方法的所有限制也适用于 Lambda 表達式。有關更多資訊,請參見匿名方法(C# 程式設計指南)。  

特殊

下列規則适用于 Lambda 表達式中的變量範圍: 捕獲的變量将不會被作為垃圾回收,直至引用變量的委托超出範圍為止。 在外部方法中看不到 Lambda 表達式内引入的變量。 Lambda 表達式無法從封閉方法中直接捕獲 ref 或 out 參數。 Lambda 表達式中的傳回語句不會導緻封閉方法傳回。 Lambda 表達式不能包含其目标位于所包含匿名函數主體外部或内部的 goto 語句、break 語句或 continue 語句。 Lambda表達式的本質是“匿名方法”,即當編譯我們的程式代碼時,“編譯器”會自動将“Lambda表達式”轉換為“匿名方法”,如下例:  

string[] names={"agen","balen","coure","apple"};
string[] findNameA=Array.FindAll<string>(names,delegate(string v){return v.StartsWith("a");});
string[] findNameB=Array.FindAll<string>(names,v=>v.StartsWith("a"));      

上面中兩個FindAll方法的反編譯代碼如下:

string[]findNameA=Array.FindAll<string>(names,delegate(string v){return v.StartsWith("a");});
string[]findNameB=Array.FindAll<string>(names,delegate(string v){return v.StartsWith("a");});      

  進而可以知道“Lambda表達式”與“匿名方法”是可以劃上等号的,隻不過使用“Lambda表達式”輸寫代碼看上去更直覺漂亮,不是嗎? Lambda表達式的文法格式: 參數清單 => 語句或語句塊 其中“參數列”中可包含任意個參數(與委托對應),如果參數列中有0個或1個以上參數,則必須使用括号包覆參數列,如下: () => Console.Write("0個參數") I => Console.Write("1個參數時參數列中可省略括号,值為:{0}",i) (x,y) => Console.Write("包含2個參數,值為:{0}*{1}",x,y) 而“語句或語句塊”中如果隻有一條語句,則可以不用大括号包覆否則則必須使用,如下: I => Console.Write("隻有一條語句") I => { Console.Write("使用大括号的表達式"); } //兩條語句時必須要大括号 I => { i++;Console.Write("兩條語句的情況"); } 如果“語句或語句塊”有傳回值時,如果隻有一條語句則可以不輸寫“return”語句,編譯器會自動處理,否則必須加上,如下示例: “Lambda表達式”是委托的實作方法,是以必須遵循以下規則: 1)“Lambda表達式”的參數數量必須和“委托”的參數數量相同; 2)如果“委托”的參數中包括有ref或out修飾符,則“Lambda表達式”的參數列中也必須包括有修飾符;

轉載于:https://www.cnblogs.com/tinya/p/4632723.html

c#