認識Lambda表示式

2022-08-27 20:36:10 字數 3045 閱讀 4071

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表示式」轉換為「匿名方法」,如下例:

上面中兩個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...