C#中ExpressionTree需要學習嗎?如何學習?

花瓣兒魚


表達式樹的作用類似於抽象語法樹(AST),可以讓開發者自己構造語法樹,結合 lambda,可以用在 LINQ動態查詢之類的功能。

先簡單介紹下抽象語法樹(AST),AST 的應用非常廣泛。 它可以將源代碼的語法結構(理論上可以支持任何語言)抽象為樹狀的形式,樹上的每個元素都表示源碼中的一種結構。

舉個簡單的例子,用 AST 來表示 2 * 7 + 3是這樣:

是不是非常清晰明瞭? 有了這個樹,求值只需要遍歷樹就。

通常在這些領域會用到抽象語法樹:

  • 編譯器: 對源碼進行詞法分析和語法分析後構造出抽象語法樹後,就可以根據語法樹生成目標語言(如機器碼或中間碼);
  • 解釋器: 跟編譯器的原理類似,構造好的語法樹可以用於解釋執行,據我所知,很多js腳本引擎就是這麼幹的。
  • 語法高亮,代碼格式化、自動補全等;

網上找了張圖,邏輯很清晰。

再說下 C# 裡的表達式樹,微軟已經提供了常用的各種表達式部件,如一元、二元運算、Lambda、條件表達式等,我們可以根據需要來構造表達式樹,結果可以用於動態編譯執行。

字數湊得差不多了,說點我自己的看法。

  • 抽象語法樹是個很有用的東西,做開發最好能深入理解;
  • 表達式樹在一些動態業務邏輯場景用得上,不過並不優雅,因為構造表達式的過程比較繁瑣,而且運行時編譯可能會帶來內存不能正常回收的問題;
  • 動態業務場景我更喜歡用 JavaScript,即在程序中嵌入一個JavaScript引擎,動態執行腳本,簡單粗暴速度快,對系統的侵入更小。

熙爸愛釣魚


什麼是表達式樹

首先,所謂的表達式樹本身也是一個表達式一個表達式也是一棵表達式樹,只不過它是一棵小的表達式樹,我們可以把表達式樹和表達式認為是一個東西。表達式樹以樹形數據的結構形式來代表代碼,其中樹上的每個節點都是一種表達式。

表達式樹的作用

我們可以對錶達式樹上的代碼進行編輯和運算,從而在不同數據庫中執行Linq查詢,還能通過動態語言運行時(DLR)提供與. Net Framework之間的互操作性。

在我們實際的開發過程中,往往會遇到對內容進行多條件篩選的情況。而多條件對於初級的開發人員來說,可能直接通過if else 就進行操作了,但是如果要把所有的條件都考慮進去,這種條件判斷的方式就會非常繁瑣,這個時候,表達式樹就可以體現它的作用了。

特別是在C#中,使用ORM框架,如Entity Framework時,表達式樹的作用就體現的非常明顯。比如,其中的Linq查詢就是能充分體現表達式樹的價值。通過Lambda表達式直接轉換為表達式樹,而如果要構造更加複雜的結構,用Linq構造連式Lambda就能達到目的。只要再對其構成的這個複雜結構解析和翻譯就能夠實現跨語言的算法平移,當然這些工作已經有現成的類庫或框架去完成,我們只需要站在巨人的肩膀上就能達成目的。

個人覺得,如果要進一步提升自己的編程深度或者說技巧,還是有必要學習表達式樹,其實重要的是多寫多練習多理解,慢慢這塊就沒問題了。

以上是自己一點理解,希望答案能領你滿意!


分享到:


相關文章: