委託定義型別,型別指定特定方法簽名。 可將滿足此簽名的方法(靜態或例項)分配給該型別的變數,然後(使用適當引數)直接呼叫該方法,或將其作為引數本身傳遞給另一方法再進行呼叫。 以下示例演示了委託的用法。
usingsystem;
using
system.linq;
public
class
program
static
void main(string
args)
}
為簡化開發過程,.net 包含一組委託型別,程式設計師可重用這些型別而無需建立新型別。 其中包括func<>
、action<>
和predicate<>
,可用於 .net api 的各個位置,無需定義新委託型別。 當然,從這三者的簽名可以看出它們之間存在某些差異,主要影響其既定用途:
現在可使用func<>
委託而非自定義型別重新編寫上述示例。 程式將照舊繼續執行。
usingsystem;
using
system.linq;
public
class
program
static
void main(string
args)
}
對於此簡單示例而言,在main
方法之外定義方法似乎有些多餘。 因此 .net framework 2.0 引入了匿名委託的概念。 在其支援下,可建立「內聯」委託,而無需指定任何其他型別或方法。 只需在所需位置內聯委託的定義即可。
例如,要進行切換並使用匿名委託篩選出只有偶數的列表,然後將其列印到控制台。
usingsystem;
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 表示式而不是匿名委託。
usingsystem;
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 只是委託,這意味著可將其順利用作事件處理程式,如以下**片段所示。
publicmainwindow()
;}
此上下文中的+=
運算子用於訂閱事件。
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方法是擴充套...