你知道C 中的Lambda表示式的演化過程嗎?

2022-01-11 03:56:19 字數 2026 閱讀 3848

那得從很久很久以前說起了,記得那個時候...

懵懂的記得從前有個叫委託的東西是那麼的高深難懂。

例一:

什麼是委託?

個人理解:用來傳遞方法的型別。(用來傳遞數字的型別有int、float、double,用來傳遞方法的就有委託)

例二:

又經過了很久很久...

很多時候委託接收的方法是一次性的或者方法體是非常簡單的...

例三:

我們可以寫成:

有沒有發現我們每次都要定義委託,很多時候簽名可能是一樣的。這樣就沒有必要定義重複的。

然後又過了很久很久...

可能老大也覺得我們每次定義委託有點傻,所以乾脆在框架內一次定義好所有可能用到的委託。那千變萬化的方法簽名怎麼可能定義得全?沒關係,定義成泛型的不就可以了嗎。

先說func:

細心的朋友可能看到了,func相對於adddelegate多定義了乙個int。多出了的那個是指的是返回型別。我們f12看對應的定義:

關於上面func的寫法我們可以簡寫成:(語法糖而已,編譯後還是注釋的**)

再看action:

我們等了又等,又過了好久好久...

我xx,這tm就是親兄弟啊。直接去掉delegate關鍵字,然後加乙個=>就成了lambda表示式了。(=>讀作goes to)

我們繼續簡化:

丟掉引數型別也是可以的,因為強大的vs可以根據泛型委託func自己推斷出來引數型別。

還可以簡化嗎?當然:

return關鍵字也不要了,大括號也不要了。(當然,方法體只有單條語句才能怎麼做)

現在看起來已經非常接*我們*時用的lambda表示式了。

如果傳入引數只有乙個的話,我們還可以繼續簡化:

這就是我們*時見得最多的lambda長相了。

要長成這樣也是有要求的:

只能有乙個傳入引數

方法體只能只一條語句。

關於第1點,lambda我們*時用得較多的是基於ienumerable或iqueryable,所以只能有乙個引數也就滿足了。

關於第2點,我們使用擴充套件方法的鏈式程式設計來解決。

如:(用鏈式來解決第二點)

從此,我們過上了幸福的生活...

借《深入理解c#》中的一圖:

小知識:(非同步lambda)

funcbool>> func = async t =>;
結束:本文簡短的說了下lambda表示式在c#中的一步步演化。說的不一定對,輕拍!

本文以同步至《c#基礎知識鞏固系列》

你知道C 中的Lambda表示式的演化過程嗎?

那得從很久很久以前說起了,記得那個時候.懵懂的記得從前有個叫委託的東西是那麼的高深難懂。例一 什麼是委託?個人理解 用來傳遞方法的型別。用來傳遞數字的型別有int float double,用來傳遞方法的就有委託 例二 又經過了很久很久.很多時候委託接收的方法是一次性的或者方法體是非常簡單的.例三 ...

C 中Lambda表示式

c 語言還是比較常見的東西,這裡我們主要介紹c lambda表示式,包括介紹乙個lambda就是乙個delegate,乙個delegate指向乙個方法等方面。你有沒有接觸過c lambda表示式,有沒有覺得匿名方法這東西很不錯,減少了很多 阿,但是匿名方法的使用還並不人性化,什麼是人性化呢?比如你可...

C 中lambda表示式

在介紹lambda表示式之前,我想先介紹以下c 標準庫所支援的傳統謂詞以及傳統謂次的不足,而由此才引入的lambda表示式 謂詞是個可呼叫的表示式,其返回結果是乙個能作為條件的值。謂詞分為一元和二元,一元的可呼叫物件只能有乙個引數,二元只能有倆個引數 我們以一元謂詞舉例 c 標準庫中的find if...