C 委託之匿名方法和lambda表示式

2021-10-06 23:36:40 字數 1436 閱讀 1139

在前面兩篇文章c# 委託的基本概念和c# action和func委託中,要使用委託,必須提前把方法寫好,但還有新的使用委託的方式,那就是匿名方法。

使用匿名方法時,在例項化委託的時候將會有所不同:

class program

;writeline(anondel("start of string"));

}}

func委託接受乙個字串引數,返回乙個字串,anondel就是這個委託變數,例項化的時候,不是把方法名賦予這個變數,而是使用一段**。

這段**前面是關鍵字delegate,後面是乙個字串引數。匿名方法的使用可以使**更加簡潔。當然,如果乙個匿名方法需要使用多次,就不要使用匿名方法,編寫乙個命名方法更好。

但在實踐中,我們一般也不使用匿名方法,而是使用lambda表示式。

從c#3.0之後,可以使用一種新的語法把實現的**賦予委託,那就是lambda表示式,上面的例子我們就可以修改為lambda表示式:

class program

;writeline(anondel("start of string"));

}}

lambda運算子"=>"的左邊是輸入引數,右邊是實現的**。

如果只有乙個引數,只寫出引數名即可:

funconeparam=s=>$"change uppercase";

writeline(oneparam("test"));

上面的lambda表示式使用了引數s,因為委託型別定義了乙個string引數,所以s型別就是string.

如果有多個引數,就把用圓括號將引數名括起來:

functwoparams=(x,y)=>x*y;

writeline(twoparms(3,2));

上面的lambda表示式,引數x和y的型別是double,由func委託定義。

為了方便,可以在圓括號中給變數名新增引數型別:

functwoparams=(double x,double y)=>x*y;

writeline(twoparms(3,2));

如果lambda表示式只有一條語句,在方法塊內就不需要花括號和return語句,因為編譯器會新增一條隱式的return語句:

funcsquare=x=>x*x;
如果有多行**,就必須新增花括號和return語句:

funcanondel = param=>

;

注:lambda表示式可以用於型別為委託的任意地方,型別是expression或expression時,也可以使用lambda表示式,此時編譯器會建立乙個表示式樹,這個在以後的文章中會提及。

參考:c#高階程式設計第十版(作者christian nagel)

lambda 委託 匿名方法

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

c 之委託 匿名方法 Lambda表示式

委託 實際上是一種資料型別。委託資料型別的定義 delegate ret type delegate name param type param name,宣告委託變數 delegate name variable name 例項化委託變數 ret type function name param ...

C 傳統的委託 匿名方法 Lambda對比

using system using system.collections.generic using system.linq using system.text namespace lambdademo 傳統的呼叫委託的示例 static void findlistdelegate predica...