委託 匿名 Lambda的區分

2021-07-06 01:25:56 字數 2820 閱讀 9559

1 委託是安全封裝方法的型別,類似於 c 和 c++ 中的函式指標。 與 c 函式指標不同的是,委託是物件導向的、型別安全的和可靠的。 委託的型別由委託的

名稱確定。delegate 類,委託是一種資料結構,它引用靜態方法或引用類例項及該類的例項方法,有屬性和方法。

分為帶有命名方法的委託與帶有匿名方法的委託(c# 程式設計指南)

// 可以放在任何乙個空檔案中作全域性messengercallback型別

public delegate void messengercallback();

public delegate void messengercallback(t arg1);

public delegate void messengercallback(t arg1, u arg2);

public delegate void messengercallback(t arg1, u arg2, v arg3);

2 匿名函式是乙個「內聯」語句或表示式,可在需要委託型別的任何地方使用。 可以使用匿名函式來初始化命名委託,或傳遞命名委託(而不是命名委託型別

)作為方法引數。

eg: button1.click += delegate(system.object o, system.eventargs e) ;

3 「lambda 表示式」(lambda expression,)是乙個c,lambda表示式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是乙個

匿名函式,即沒有函式名的函式。

形參列表=>函式體 (input parameters) => expression

() => somemethod() --無參

del mydelegate = x => x * x 等價於 del mydelegate = (x) => x * x; ---1參

(x, y) => x == y 有時,編譯器難以或無法推斷輸入型別。 如果出現這種情況,你可以按以下示例中所示方式顯式指定型別:

(int x, string s) => s.length > x

lambda表示式的本質是「匿名方法」,即當編譯我們的程式**時,「編譯器」會自動將「lambda表示式」轉換為「匿名方法」,如下例:

string findnamea=array.findall(names,delegate(string v));

string findnameb=array.findall(names,v=>v.startswith("a"));

上面中兩個findall方法的反編譯**如下:

stringfindnamea=array.findall(names,delegate(stringv));

stringfindnameb=array.findall(names,delegate(stringv));

從而可以知道「lambda表示式」與「匿名方法」是可以劃上等號的,只不過使用「lambda表示式」輸寫**看上去更直觀漂亮,不是嗎?

///ps:匿名方法是c#2.0引入的乙個新特性,它允許開發者內聯(inline)宣告自己的函式**而無須使用委託函式(delegate function。

匿名方法通常在:

1. 需要乙個臨時方法,該方法使用次數極少;

2. 這個方法的**很短,甚至可能比方法宣告都短的情況下使用。

利用delegate關鍵字建立匿名方法,如下:

button1.click += delegate(system.object o, system.eventargs e);/

----發展史:

1. 在c# 1.1裡,宣告和使用委託要求你有委託和乙個在委託被觸發時具有匹配簽名的能夠執行的方法,以及乙個將命名方法與委託關聯的分配語句。

2. 作為c# 2.0的新特性,匿名方法基本上能夠提供與先前命名方法相同的功能,但是它已經不再需要乙個在關聯到委託之前就明確建立的方法了。

3. c#3.0中提供了乙個新特性--lambda表示式,它提供了完成相同目標的更加簡潔的格式。

class test

static void main(string args)

;// c# 3.0. a delegate can be initialized with

// a lambda expression. the lambda also takes a string

// as an input parameter (x). the type of x is inferred by the compiler.

testdelegate testdelc = (x) => ;

// invoke the delegates.

testdela("hello. my name is m and i write lines.");

testdelb("that's nothing. i'm anonymous and ");

testdelc("i'm a famous author.");

// keep console window open in debug mode.

console.writeline("press any key to exit.");

console.readkey();}}

///共有兩種匿名函式,以下主題中分別討論了這些函式:

1. lambda 表示式

2.匿名方法

有一種情況下,匿名方法提供了 lambda 表示式中所沒有的功能。 您可使用匿名方法來忽略引數列表。 這意味著匿名方法可轉換為具有各種簽名的委託。 這

對於 lambda 表示式來說是不可能的.

通過使用匿名方法,由於您不必建立單獨的方法,因此減少了例項化委託所需的編碼系統開銷。

lambda 委託 匿名方法

委託 delegate是c 中的一種型別,它實際上是乙個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有乙個簽名 signature 並且它只能持有與它的簽名相匹配的方法的引用。它所實現的功能與c c 中的函式指標十分相似。它允許你傳遞乙個類a的方法m給另乙個類b的物件,使得...

委託 匿名變數 Lambda演變

歷史 2.0之前 委託 2.0後 匿名變數 3.0後 lambda表示式 之間的區別 委託delegate int calculator int x,int y 定義委託 static void main 加法 public static int adding int x,int y 匿名方法 de...

匿名委託Lambda表示式

2種形式都是宣告委託的形式 2.0以前 c 命名方法是宣告委託的唯一方法 c 2.0 之後引入匿名方法 c 3.0以及更高版本中 使用lambda表示式 取代了匿名方法 作為編寫內聯 的首選方式 匿名方法 delegate void anonymity int x anonymity m anony...