日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
LinqLambda表達(dá)式全面分析

在向大家詳細(xì)介紹Linq Lambda表達(dá)式之前,首先讓大家了解下expr是什么樣的東西,然后全面介紹Linq Lambda表達(dá)式。

介紹Linq Lambda表達(dá)式之前,先看一個(gè)例子:

 
 
 
  1. Expression, bool>> expr = o => o.Length > 10;

初次接觸Linq Lambda表達(dá)式的人可能會(huì)被搞迷糊,這樣的語(yǔ)句到底是什么意思,怎么樣工作,原理又是什么。

逐級(jí)分析以上語(yǔ)句,分為兩個(gè)部分,以等號(hào)為界。

第一部分是變量類型的申明:Expression> expr,表示expr這個(gè)變量是一個(gè)Linq Lambda表達(dá)式,這個(gè)表達(dá)式符合這樣的一種委托:bool DelegateName(string obj)。

第二部分是表達(dá)式的聲明o => o.Length > 10,這個(gè)“=>”是Lambda操作符,讀作“轉(zhuǎn)到”,必須把=>左右看成是一個(gè)整體,因?yàn)檫@實(shí)際是一個(gè)匿名方法,“=>”左邊是方法傳入?yún)?shù)的申明,右邊是函數(shù)體,如果用常規(guī)的表示方法,可以寫成如下形式:

 
 
 
  1. bool MethodName(string o)
  2. {
  3. return o.Length > 10;
  4. }

仔細(xì)觀察兩部分拆解以后的形式其實(shí)不難發(fā)現(xiàn),第一部分的工作是定義了一個(gè)匿名的委托,而第二部分則是符合這個(gè)匿名委托的一個(gè)方法,由于這個(gè)方法沒(méi)有明確給定名稱,因此稱為匿名方法。

那么,expr到底又是什么樣的東西。有一點(diǎn)必須明確的是,expr表示絕對(duì)不是這個(gè)匿名方法的返回值,而是這個(gè)匿名方法中所有表達(dá)式的System.Linq.Expressions.Expression形式。也就是說(shuō),在expr中,這個(gè)函數(shù)體里所有的表達(dá)式已經(jīng)被拆解成一個(gè)一個(gè)的單元,每一個(gè)單元都是一種System.Linq.Expressions.Expression的派生類。由于表達(dá)式和表達(dá)式之前存在著上下級(jí)的關(guān)系,因此所有的表達(dá)式呈現(xiàn)一種樹狀結(jié)構(gòu),稱為表達(dá)式樹。

一個(gè)匿名方法是如何轉(zhuǎn)換為表達(dá)式樹的呢?這個(gè)問(wèn)題其實(shí)不用太過(guò)關(guān)心,因?yàn)镃#編譯器在對(duì)程序編譯的時(shí)候已經(jīng)將上述第二部分的內(nèi)容自動(dòng)轉(zhuǎn)換為相應(yīng)的表達(dá)式樹了。上述例子中編譯的結(jié)果通過(guò)Reflector反編譯出來(lái)的內(nèi)容如下所示:

 
 
 
  1. 1. ParameterExpression CS$0$0000;
  2. 2. Expression, bool>> expr = Expression.Lambda
    bool>>(Expression.GreaterThan(Expression.Property(CS$0$0000 = Expression.
    Parameter(typeof(string), "o"), (MethodInfo) methodof(string.get_Length)), 
    Expression.Constant(10, typeof(int))), new ParameterExpression[] { CS$0$0000 });

這串代碼看起來(lái)有點(diǎn)糊,我把代碼梳理了一下使得它更容易讀,如下所示:

 
 
 
  1. Expression, bool>> expr;
  2. // 創(chuàng)建表示參數(shù)的表達(dá)式。
  3. ParameterExpression paramExpr = Expression.Parameter(typeof(string), "o");
  4. // 獲取表示System.String.Length屬性的System.Reflection.PropertyInfo對(duì)象。
  5. PropertyInfo propInfo = typeof(string).GetProperty
    ("Length", BindingFlags.Instance | BindingFlags.Public);
  6. // 創(chuàng)建訪問(wèn)System.String.Length屬性的表達(dá)式。
  7. MemberExpression memberExpr = Expression.Property(paramExpr, propInfo);
  8. // 創(chuàng)建一個(gè)表示常量10的表達(dá)式。
  9. ConstantExpression constExpr = Expression.Constant(10, typeof(int));
  10. // 創(chuàng)建表示左邊大于右邊的二分表達(dá)式。
  11. BinaryExpression greaterThanExpr = Expression.GreaterThan(memberExpr, constExpr);
  12. // 通過(guò)上述二分表達(dá)式創(chuàng)建一個(gè)Lambda表達(dá)式。
  13. expr = Expression.Lambda, bool>>(greaterThanExpr, paramExpr);

是不是好麻煩???呵呵,好在這些工作已經(jīng)在編譯的時(shí)候完成了,不需要我們手工創(chuàng)建,除非你想動(dòng)態(tài)創(chuàng)建表達(dá)式。關(guān)于如何動(dòng)態(tài)創(chuàng)建表達(dá)式,我在這里就先不詳細(xì)說(shuō)明了,將在下一博里再詳述。

綜上所述,對(duì)待Linq Lambda表達(dá)式,最基本一個(gè)原則是不要把表達(dá)式看成了語(yǔ)句的運(yùn)算結(jié)果,而應(yīng)該看成這些語(yǔ)句本身,也就是把語(yǔ)句作為對(duì)象來(lái)處理。語(yǔ)句和語(yǔ)句之間通過(guò)表達(dá)式樹來(lái)關(guān)聯(lián),而從語(yǔ)句轉(zhuǎn)換為表達(dá)式樹已由編譯器自動(dòng)完成,不需要人工介入。


網(wǎng)頁(yè)標(biāo)題:LinqLambda表達(dá)式全面分析
標(biāo)題URL:http://www.5511xx.com/article/dpisjjg.html