C# Lambda表達式

2021-12-06 16:36 更新

C# Lambda表達式

lambda表達式是一個未命名的方法,代替一個委托實例。

給定以下委托類型:

delegate int Converter (int i);

我們可以如下分配和調(diào)用lambda表達式x => x * x:

Converter sqr = x => x * x;
Console.WriteLine (sqr(3)); // 9

lambda表達式具有以下形式:

(parameters) => expression
We can omit the parentheses if and only if there is exactly one
parameter of an inferable type.

在我們的示例中,有一個參數(shù), x ,表達式為 x * x :

x => x * x;

lambda表達式的每個參數(shù)都對應(yīng)一個委托參數(shù),表達式的類型對應(yīng)于委托的返回類型。

在上面的代碼中, x 對應(yīng)于參數(shù) i ,表達式 x * x 對應(yīng)于返回類型 int ,因此它與 Converter 委托兼容,如下所示:

delegate int Converter (int i);

lambda表達式的代碼可以是語句塊而不是表達式。

x => { return x * x; };

Lambda表達式最常用于Func和Action委托。

我們可以重寫上面的代碼如下:

Func<int,int> sqr = x => x * x;

下面是一個接受兩個參數(shù)的表達式示例:

Func<string,string,int> totalLength = (s1, s2) => s1.Length + s2.Length;
int total = totalLength ("a", "the"); 

捕獲外部變量

lambda表達式可以引用定義它的方法的局部變量和參數(shù)。

例如:

static void Main(){
   int factor = 2;
   Func<int, int> multiplier = n => n * factor;
   Console.WriteLine (multiplier (3)); // 6
}

由lambda表達式引用的外部變量稱為捕獲變量。

捕獲變量的lambda表達式稱為閉包。

捕獲的變量在實際調(diào)用委托時求值,而不是在捕獲變量時求值:

int factor = 2;
Func<int, int> multiplier = n => n * factor;
factor = 3;
Console.WriteLine (multiplier (3)); // 9

Lambda表達式可以更新捕獲的變量:

int outerVariable = 0;
Func<int> myLambda = () => outerVariable++;
Console.WriteLine (myLambda()); // 0
Console.WriteLine (myLambda()); // 1
Console.WriteLine (outerVariable); // 2

匿名方法

要編寫匿名方法,請包括delegate關(guān)鍵字,隨后可以包含參數(shù)聲明,然后是方法體。

例如,給這個代理:

delegate int Converter (int i);

我們可以寫和調(diào)用匿名方法如下:

Converter sqr = delegate (int x) {return x * x;};
Console.WriteLine (sqr(3)); // 9

第一行在語義上等同于以下lambda表達式:

Converter sqr = (int x) => {return x * x;};

或者簡單為:

Converter sqr = x => x * x;

匿名方法以與lambda表達式相同的方式捕獲外部變量。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號