lambda表示式的本質是「匿名方法」,也即是當編譯我們的程式**時,「編譯器」會自動幫我們將「lambda表示式」轉換為「匿名方法」,如下例:
上面中兩個findall方法的反編譯**如下:
string findnamea = array.findall(names, delegate (string v) );
string findnameb = array.findall(names, delegate (string v) );
從而可以知道「lambda表示式」與「匿名方法」是可以劃上等號的,只不過使用「lambda表示式」輸寫**看上去更直觀漂亮,不是嗎?
「lambda表示式」的語法格式:
引數列 => 語句或語句塊
其中「引數列」中可包含任意個引數(與委託對應),如果引數列中有0個或1個以上引數,則必須使用括號括住引數列,如下:
()=>console.write("0個引數")
i=>console.write("1個引數時引數列中可省略括號,值為:",i)
(x,y) =>console.write("包含2個引數,值為:*",x,y)
而「語句或語句塊」中如果只有一條語句,則可以不用大括號括住否則則必須使用,如下:
i=>console.write("只有一條語句")
i=>
//兩條語句時必須要大括號
i=>
如果「語句或語句塊」有返回值時,如果只有一條語句則可以不輸寫「return」語句,編譯器會自動處理,否則必須加上,如下示例:
class test
static void main()
);console.read();}}
「lambda表示式」是委託的實現方法,所以必須遵循以下規則:
1)「lambda表示式」的引數數量必須和「委託」的引數數量相同;
2)如果「委託」的引數中包括有ref或out修飾符,則「lambda表示式」的引數列中也必須包括有修飾符;
例子:class test
static void main()
}注: 如果包括有修飾符,則「lambda表示式」中的引數列中也必須加上引數的型別!
3)如果「委託」有返回型別,則「lambda表示式」的「語句或語句塊」中也必須返回相同型別的資料;
4)如果「委託」有幾種資料型別格式而在「lambda表示式」中「編譯器」無法推斷具體資料型別時,則必須手動明確資料型別。
例子:(錯誤**)
class test
", test(1, 2));
}static void print(addhandlertest)
", test(1d, 2d));
}static void main()
}當我們編譯以下**時,編譯器將會顯示以下錯誤資訊:
所以我們必須明確資料型別給編譯器,如下:
print((int x, int y) => x + y);
這樣我們的**就能編譯通過了:)
認識Lambda表示式
lambda表示式的本質是 匿名方法 也即是當編譯我們的程式 時,編譯器 會自動幫我們將 lambda表示式 轉換為 匿名方法 如下例 上面中兩個findall方法的反編譯 如下 string findnamea array.findall names,delegate string v strin...
認識Lambda表示式
lambda表示式的本質是 匿名方法 也即是當編譯我們的程式 時,編譯器 會自動幫我們將 lambda表示式 轉換為 匿名方法 如下例 上面中兩個findall方法的反編譯 如下 string findnamea array.findall names,delegate string v strin...
lambda表示式 lambda表示式
1.概述 c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 muta...