c++和c#的lambda函數(shù)

C++

可以當(dāng)作匿名函數(shù),c++11加入
語法:[captures] (params) -> ret {Statments;}
Statments :語句
ret:return,返回值的類型
params:參數(shù)列表
captures:變量捕獲
如:[ ] (int a) -> bool { cout<<a; return true; };
沒有返回值(即void)可不寫-> ret ,即簡寫成[ ] (int a) { cout<<a; };

其中captures為捕獲外部變量使用:
[ ]:不捕獲變量
[&] :引用
[=]:賦值,即拷貝一份
[value]:單獨(dú)拷貝value
[this]:當(dāng)前類的this
[&,v1]:多個(gè)選項(xiàng)逗號隔開
例子:

int a=10;
[ ]( ) {cout<<a; }  //非法
[&]( ) {cout<<a; }  //a是引用
[=]( ) {a=10; }  //::a不變

C#

Lambda 表達(dá)式是一種可用于創(chuàng)建 委托表達(dá)式目錄樹 類型的 匿名函數(shù) 。
語法:(params) => {Statments;}(params) => expression。與c++對比,沒有方括號,->=>,不能寫返回類型ret,返回值類型由被賦值的委托對象決定。
注意:
1.參數(shù)類型可不寫,當(dāng)編譯器推斷困難出錯(cuò)時(shí)要顯式指定。

2.參數(shù)只有一個(gè)且無顯式指定類型可不用括號包起來,其余情況必需有括號。

3.=>右則為表達(dá)式時(shí),如果有返回值則表達(dá)式同時(shí)充當(dāng)返回值(相當(dāng)于隱藏return)。如果是語句塊,用回花括號{}括起來即可。注意return value 這種不是表達(dá)式是語句,需要花括號

4.c#的var和c++的auto對lambda是有些不同的。c++可直接auto m=(lambda表達(dá)式)獲取匿名函數(shù),但在c#中不能用var代替,必須顯式的指定類型(類名) m=(lambda表達(dá)式)。這里的類名需要在方法體外(可以類成員or命名空間內(nèi))使用特殊的定義方法:

delegate int A(int i); //就是像方法一樣定義,前面加關(guān)鍵字delegate,A就能用來定義
....//代碼
A a = x => x*x; //形參x與上面的i不需要同名稱,跟平時(shí)理解的參數(shù)相同(實(shí)際就是用一個(gè)委托對象指向匿名函數(shù))
//或A a = (int x) => x*x;
//或A a = (int x) =>{ return x*x ;};

Java

語法:(params) -> {Statments;}(params) -> expression,就是把c#的=>又換回->,其余一個(gè)鳥樣。如果要像c++和c#一樣指向該lambda函數(shù),java用Cosumer接口去指向,詳情右轉(zhuǎn)jdk1.8

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容