當前位置:編程學習大全網 - 編程語言 - lambada表達式

lambada表達式

lambada表達式

Lambda 表達式(lambda expression)是壹個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是壹個匿名函數,即沒有函數名的函數。Lambda表達式可以表示閉包(註意和數學傳統意義上的不同)。

C#表達式

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

(object argOne, object argTwo) => {; /*Your statement goes here*/}

函數體多於壹條語句的可用大括號括起。

類型

可以將此表達式分配給委托類型,如下所示:

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表達式的語法格式:

參數列表 => 語句或語句塊[1]

其中“參數列”中可包含任意個參數(與委托對應),如果參數列中有0個或1個以上參數,則必須使用括號括住參數列,如下:

x => x + 1 ? // Implicitly typed, expression body

x => { return x + 1; } ? // Implicitly typed, statement body

(int x) => x + 1 // Explicitly typed, expression body

(int x) => { return x + 1; } // Explicitly typed, statement body

(x, y) => x * y ?// Multiple parameters

() => Console.WriteLine() // No parameters

async (t1,t2) => await t1 + await t2 // Async

delegate (int x) { return x + 1; } ? // Anonymous method expression

delegate { return 1 + 1; } ? // Parameter list omitted

  • 上一篇:什麽是雙向情感障礙?雙向情感障礙能做什麽工作?
  • 下一篇:bep20和bep2的區別有哪些?
  • copyright 2024編程學習大全網