那得從好久好久之前提及了,記得那個時候...html
懵懂的記得從前有個叫委託的東西是那麼的高深難懂。編程
例一:框架
什麼是委託?異步
我的理解:用來傳遞方法的類型。(用來傳遞數字的類型有int、float、double,用來傳遞方法的就有委託)async
例二:spa
又通過了好久好久...code
不少時候委託接收的方法是一次性的或者方法體是很是簡單的...htm
例三:blog
咱們能夠寫成:get
有沒有發現咱們每次都要定義委託,不少時候簽名多是同樣的。這樣就沒有必要定義重複的。
而後又過了好久好久...
可能老大也以爲咱們每次定義委託有點傻,因此乾脆在框架內一次定義好全部可能用到的委託。那變幻無窮的方法簽名怎麼可能定義得全?不要緊,定義成泛型的不就能夠了嗎。
先說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)
Func<Student, Task<bool>> func = async t => { await Task.Delay(100);//等待100毫秒 return false; };
結束:
本文簡短的說了下lambda表達式在C#中的一步步演化。說的不必定對,輕拍!
本文以同步至《C#基礎知識鞏固系列》