C 3 0 Lamdba表示式與表示式樹

2022-02-21 07:07:45 字數 1316 閱讀 4834

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

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

還記得.net framework給我們內建了兩種委託 func與 action下面使用它們來進行lamdba的編寫

第乙個版本,首先定義了乙個func型別的委託變數,然後使用lamdba表示式進行例項化委託變數。

(x) =>

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

第二個版本

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

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

表示式樹是把**做為資料,它是一種資料型別,資料就是**,這可能聽起來很繞。

使用表示式樹可以將**表示成乙個物件樹,在linq中大量的被應用。樹形結構都知道是什麼,表達樹式的每乙個節點都是乙個表示式,在c#中我們使用experssion類進行建立表示式樹。下面建立乙個簡單的表示式樹

首先建立第乙個節點,然後建立第二個節點。用add型別的表示式將他們組合起來。再列印到螢幕上,會列印4嗎?並不會,表示式樹只是一種資料結構,並不是可被執行的**。所以列印出來的是當前的結構

表示式樹可以編譯成委託,使用lamdbaexperssion,使用它可以把資料結構編譯成可執行的**。

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

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

python中的lamdba表示式

lamdba為乙個表示式,函式體比def簡單。它的主體是乙個表示式,而不是乙個 塊,僅僅能在lamdba表示式中封裝有限的邏輯進去。舉例如下 f lambda x x x print f 3 9 f1 lambda x,y,z x y z print f1 2,3,10 15 n 5 reduce ...

(二十三)Lamdba表示式的使用

學前問?什麼是lambda表示式?有什麼作用?如何使用lambda表示式?使用它有哪些限制?0 函式式程式設計思想 注重結果,不注重過程,對於誰去做的,如何做的都不關心,只要結果得到即可。1 匿名內部類的優缺點 優點 不需要建立物件,直接寫 缺點 比較複雜,冗餘。1.1 lambda表示式與匿名內部...

表示式求值與字尾表示式

乙個算術表示式,含有數字 為簡化處理,數字只有一位 運算子 以及括號,求表示式的值。給出的表示式是一般我們見到的中綴表示式,即運算子位於運算元之間。如果把中綴表示式轉化為字尾表示式,那麼對字尾表示式求值將會很方便。字尾表示式特點 1.操作符位於運算元之後 2.沒有括號 3.運算子沒有優先順序。中綴表...