C#3.0 Lamdba表達式與表達式樹


Lamdba表達式與表達式樹

   

Lamdba表達式

C#2.0中的匿名方法使得創建委托變得簡單起來,甚至想不到還有什么方式可以更加的簡化,而C#3.0中的lamdba則給了我們答案。

lamdba的行為實際上和匿名方法是一致的,可以簡單粗暴的理解為是匿名方法的進化版本,和匿名方法作用一致,但書寫起來更加簡單,lamdba表達式有特別的轉換規則,表達式並不是委托類型(Delegate),而它可以隱式或顯式的轉換成委托實例。

還記得.Net framework給我們內置了兩種委托 Func與 Action下面使用它們來進行lamdba的編寫

   

第一個版本,首先定義了一個Func<string,string>類型的委托變量,然后使用lamdba表達式進行實例化委托變量。

(x) => { To-do…}

小括號里是參數,這里只有一個string類型的參數所以寫一個 x也就是我們string類型的參數,但是在這里我們並不需要指定類型。 然后是=> 最后是 大括號,里面是方法主體。

   

第二個版本

在這個版本可就厲害了,可以看到小括號被忽略了,大括號也被忽略了,甚至return 也不存在了,當然這是需要特殊情況下才可以這么去寫的,如果參數是兩個,那么就要乖乖的把小括號寫上了,而后面的主體如果具有邏輯運算,也要把大括號加上。不過現在已經可以看到lamdba表達式是多么驚人了

   

在一切可以使用匿名方法和委托的地方都可以換成簡潔的lamdba表達式

   

   

表達式樹

表達式樹是把代碼做為數據,它是一種數據類型,數據就是代碼,這可能聽起來很繞。

使用表達式樹可以將代碼表示成一個對象樹,在Linq中大量的被應用。樹形結構都知道是什么,表達樹式的每一個節點都是一個表達式,在C#中我們使用Experssion類進行創建表達式樹。下面創建一個簡單的表達式樹

   

   

首先創建第一個節點,然后創建第二個節點。用add類型的表達式將他們組合起來。再打印到屏幕上,會打印4嗎?並不會,表達式樹只是一種數據結構,並不是可被執行的代碼。所以打印出來的是當前的結構

   

表達式樹可以編譯成委托,使用LamdbaExperssion,使用它可以把數據結構編譯成可執行的代碼。

除了用上面的方式去創建一個代表式,還可以直接使用lamdba表達式去創建表達式樹,會更加的簡單,不過這是有限制的,一個帶有語句塊的lamdba是不可以轉換成表達式樹的

   

事實上lamdba和表達式樹是天生一對,他們共同為linq服務,少了誰對方的存在都失去了色彩。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM