標籤:c# lambda運算式 運算式樹狀架構
運算式樹狀架構允許將 lambda 運算式表示為資料結構而非可執行代碼。運算式分類樹是System.Linq.Expressions.Expression< D > 形式的運算式分類樹類型 (expression tree type) 的值,其中 D 是任何委託類型。
如果存在從 lambda 運算式到委託類型 D 的轉換,則也存在到運算式樹狀架構類型 Expression< D > 的轉換。而lambda 運算式到委託類型的轉換產生引用該 lambda 運算式的可執行代碼的委託,到運算式樹狀架構類型的轉換建立該 lambda 運算式的運算式樹狀架構表示形式。
運算式樹狀架構是 lambda 運算式在記憶體中的高效資料表示形式,使 lambda 運算式的結構透明而又清晰。
與委託類型 D 一樣, Expression< D > 具有與 D 相同的參數和傳回型別。
下面的樣本將 lambda 運算式表示為可執行代碼和運算式樹狀架構。因為存在到 Func< int,int > 的轉換,所以也存在到 Expression< Func< int,int > > 的轉換:
Func< int,int > del = x => x + 1; // Code
Expression< Func< int,int > > exp = x => x + 1; // Data
進行上面的賦值之後,委託 del 引用返回 x + 1 的方法,運算式分類樹 exp 引用描述運算式 x => x +1 的資料結構。
泛型型別 Expression< D > 的確切定義以及將 lambda 運算式轉換為運算式樹狀架構類型時有關構造運算式樹狀架構的準確規則不在本文的介紹範圍之內,將另作說明。
有兩個要點需要明確指出:
● 並非所有 lambda 運算式都能轉換為運算式樹狀架構。例如,具有語句體的 lambda 運算式和包含賦值運算式的 lambda 運算式不能這樣表示。在這些情況下,轉換仍存在,但在編譯時間將失敗
● Expression< D > 提供一個執行個體方法 Compile,該方法產生一個類型為 D 的委託:
Func< int,int > del2 = exp.Compile();
調用此委託將導致執行運算式樹狀架構所表示的代碼。因此,根據上面的定義, del 和 del2 等效,而且
下面的兩個語句也將等效:
int i1 = del(1);
int i2 = del2(1);
執行此代碼後, i1 和 i2 的值都為 2。
[深入學習C#]運算式樹狀架構類型——Expression tree types