那得從很久很久以前說起了,記得那個時候...
懵懂的記得從前有個叫委託的東西是那麼的高深難懂。
例一:
什麼是委託?
個人理解:用來傳遞方法的型別。(用來傳遞數字的型別有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...