回覆列表
-
1 # 典型的非典型程式設計師
-
2 # 熙爸愛釣魚
表示式樹的作用類似於抽象語法樹(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就能達到目的。只要再對其構成的這個複雜結構解析和翻譯就能夠實現跨語言的演算法平移,當然這些工作已經有現成的類庫或框架去完成,我們只需要站在巨人的肩膀上就能達成目的。
個人覺得,如果要進一步提升自己的程式設計深度或者說技巧,還是有必要學習表示式樹,其實重要的是多寫多練習多理解,慢慢這塊就沒問題了。
以上是自己一點理解,希望答案能領你滿意!