基礎知識 委託和 lambda

2022-05-26 15:48:08 字數 2016 閱讀 3111

委託定義型別,型別指定特定方法簽名。 可將滿足此簽名的方法(靜態或例項)分配給該型別的變數,然後(使用適當引數)直接呼叫該方法,或將其作為引數本身傳遞給另一方法再進行呼叫。 以下示例演示了委託的用法。

using

system;

using

system.linq;

public

class

program

static

void main(string

args)

}

為簡化開發過程,.net 包含一組委託型別,程式設計師可重用這些型別而無需建立新型別。 其中包括func<>action<>predicate<>,可用於 .net api 的各個位置,無需定義新委託型別。 當然,從這三者的簽名可以看出它們之間存在某些差異,主要影響其既定用途:

現在可使用func<>委託而非自定義型別重新編寫上述示例。 程式將照舊繼續執行。

using

system;

using

system.linq;

public

class

program

static

void main(string

args)

}

對於此簡單示例而言,在main方法之外定義方法似乎有些多餘。 因此 .net framework 2.0 引入了匿名委託的概念。 在其支援下,可建立「內聯」委託,而無需指定任何其他型別或方法。 只需在所需位置內聯委託的定義即可。

例如,要進行切換並使用匿名委託篩選出只有偶數的列表,然後將其列印到控制台。

using

system;

using

system.collections.generic;

public

class

program

list

result =list.findall(

delegate (int

no)

);foreach (var item in

result)

}}

如你所見,該委託的正文只是一組表示式,其他所有委託也是如此。 但它並非單獨定義,而是在呼叫list.findall 方法時臨時引入。

但是,即使使用此方法,仍有許多可以丟棄的**。 此時就需要使用 lambda 表示式。

lambda 表示式(或簡稱「lambda」)在 c# 3.0 中作為語言整合查詢的 (linq) 核心構建基塊被首次引入。 這種表示式只是使用委託的更方便的語法。 它們將宣告簽名和方法正文,但在分配到委託之前沒有自己的正式標識。 與委託不同,可將其作為事件註冊的左側內容或在各種 linq 子句和方法中直接分配。

由於 lambda 表示式只是指定委託的另一種方式,因此應可重新編寫上述示例,令其使用 lambda 表示式而不是匿名委託。

using

system;

using

system.collections.generic;

public

class

program

list

result = list.findall(i => i % 2 == 0

);

foreach (var item in

result)

}}

在前面的示例中,所使用的 lambda 表示式為i => i % 2 == 0。 再次強調,它只是使用委託的一種非常方便的語法,因此其實際行為與使用匿名委託時相同。

再次強調,lambda 只是委託,這意味著可將其順利用作事件處理程式,如以下**片段所示。

public

mainwindow()

;}

此上下文中的+=運算子用於訂閱事件。

C 基礎知識 Lambda表示式

一 lambda表示式簡介 lambda表示式可以理解為匿名函式,可以包含表示式和語句。它提供了一種便利的形式來建立委託。lambda表示式使用這個運算子 它讀成 goes to 該運算子的左邊為輸入引數,右邊是表示式或者語句塊。二 例子 例1 1 using system 2using syste...

擴充套件方法 委託和Lambda

舉例演化lambda string names 問題 從陣列names中篩選字元長度為5的成員 先宣告乙個返回型別為bool的靜態函式 public static bool islengthfive string s return s.length 5 enumerable中的where方法是擴充套...

擴充套件方法 委託和Lambda

舉例演化lambda string names 問題 從陣列names中篩選字元長度為5的成員 先宣告乙個返回型別為bool的靜態函式 public static bool islengthfive string s return s.length 5 enumerable中的where方法是擴充套...