在linq to objects中,擴充套件方法需要將乙個委託型別作為引數,這樣就可以將lambda表示式賦予引數。lambda表示式也可以賦予expression型別的引數。
c#編譯器根據型別給lambda表示式定義不同的行為。如果型別是expression,編譯器就從lambda表示式中建立乙個表示式樹,並儲存在程式中。這樣,就可以在執行期間分析表示式樹,並進行優化,以便於查詢資料來源。
enumerable類不是唯一乙個定義了擴充套件方法的where()類,queryable類也定義了where擴充套件方法。區別是enumerable類是乙個委託型別fun作為引數謂詞,queryable類是用expreesion作為型別。
expression表示式
//委託型別
funcbool> predicate=r=>r.country=="
brazil";
//表示式樹型別
expressionbool>> prdeicate=r=>r.country=="
brazil
"
除了使委託外,編譯器還會把表示式樹放在程式集中。表示式可以在執行期間讀取。
表示式樹從派生自抽象基類expression的類中構件。expression類與expression不同。繼承自
expression類的表示式類有binaryexpression、constantexpression、invocationexpression、lambdaexpression、newexpression、newarrayexpression、temaryexpression以及unary expression等。編譯器會從lambda表示式中建立表示式樹。
例如,lambda表示式r.country=="brazil"使用了parameterexpression、memberexpression、constantexpression和methodcallexpression,來建立乙個表示式樹。並將該樹儲存在程式集中。之後執行期間使用這個樹,建立乙個用於底層資料來源的優化查詢。
displaytree()方法在控制台圖形化地顯示表示式樹。其中傳遞了乙個expression物件。並根據表示式的型別,把表示式的一些資訊寫到控制台上。根據表示式的型別,遞迴地呼叫displaytree()方法。
displaytree()方法沒有處理所有的型別,處理的型別有expressiontype.lambda、expressiontype.constant、expressiontype.parameter、expressiontype.equal、expressiontype.andalso、expressiontype.greaterthan、expressiontype.memberaccess、
使用expression型別的乙個例子是ado.net entity framework和wcf資料服務的客戶端提供程式。這些技術用expression引數定義了擴充套件方法,這樣,訪問資料庫的linq提供程式就可以讀取表示式,建立乙個執行期間優化的查詢,從資料庫中獲取資料。
4 C 基礎 表示式
運算型別轉換型別提公升 過載運算子 左值和右值 等號兩邊的物件 優先順序和結合律 運算子的優先順序和運算順序 左結合律 對於未制定求值順序的表示式,求值的時候產生的行為是未定義的。cout i i 4種明確了運算物件求值順序的運算子 運算物件的求值順序和優先順序與結合律無關。c f g h j 優先...
js基礎 表示式與變數
表示式 1.原始表示式 常量 直接量 關鍵字 變數 3.14 test null i k j 2.初始化表示式 1,2 3.函式表示式 var fe function function 4.屬性訪問表示式 var o o.x o x 5.呼叫表示式 func 6.物件建立表示式 new func 1...
C 基礎表示式和運算子
1.什麼是表示式?表示式是由運算子和運算元組組成的。運算子設定對運算元進行什麼樣的運算。在c 中,如果表示式最終的計算結果為所需的型別值,表示式就可以出現在需要自或物件的任意位置。在c 中,如果表示式最終的計算結果為所需的型別值,表示式就可以出現在需要自或物件的任意位置。2.什麼是算術運算子?算術運...