那得從很久很久以前說起了,記得那個時候...
懵懂的記得從前有個叫委托的東西是那麼的高深難懂。
例一:
什麼是委托?
個人理解:用來傳遞方法的類型。(用來傳遞數字的類型有int、float、double,用來傳遞方法的就有委托)
例二:
又經過了很久很久...
很多時候委托接收的方法是一次性的或者方法體是非常簡單的...
例三:
我們可以寫成:
有沒有發現我們每次都要定義委托,很多時候簽名可能是一樣的。這樣就沒有必要定義重復的。
然後又過了很久很久...
可能老大也覺得我們每次定義委托有點傻,所以干脆在框架內一次定義好所有可能用到的委托。那千變萬化的方法簽名怎麼可能定義得全?沒關系,定義成泛型的不就可以了嗎。
先說Func:
細心的朋友可能看到了,Func相對於AddDelegate多定義了一個int。多出了的那個是指的是返回類型。我們F12看對應的定義:
關於上面Func的寫法我們可以簡寫成:(語法糖而已,編譯後還是注釋的代碼)
再看Action:
提醒:以後如果我們寫代碼的時候如果寫到到delegate...,你要馬上想到是否可以用Func或者Action來代替呢?C#4中的Action和Func有16個參數,足夠你用了。
我們等了又等,又過了好久好久...
我XX,這TM就是親兄弟啊。直接去掉delegate關鍵字,然後加一個=>就成了lambda表達式了。(=>讀作goes to)
我們繼續簡化:
丟掉參數類型也是可以的,因為強大的VS可以根據泛型委托Func自己推斷出來參數類型。
還可以簡化嗎?當然:
return關鍵字也不要了,大括號也不要了。(當然,方法體只有單條語句才能怎麼做)
現在看起來已經非常接近我們平時用的Lambda表達式了。
如果傳入參數只有一個的話,我們還可以繼續簡化:
這就是我們平時見得最多的lambda長相了。
要長成這樣也是有要求的:
關於第1點,lambda我們平時用得較多的是基於IEnumerable或IQueryable,所以只能有一個參數也就滿足了。
關於第2點,我們使用擴展方法的鏈式編程來解決。
如:(用鏈式來解決第二點)
從此,我們過上了幸福的生活...
借《深入理解C#》中的一圖:
本文簡短的說了下lambda表達式在C#中的一步步演化(請不要太糾結先後順序)。說的不一定對,輕拍!
文章首鏈:http://www.cnblogs.com/zhaopei/p/5767631.html
感謝您的閱讀。如果文章對您有用,那麼請輕輕點個贊,以資鼓勵。