<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 241,  comments - 116,  trackbacks - 0

    Linq相關(guān):

    Linq是以下列方式編譯:

    1. 首先,LINQ 查詢表達(dá)式轉(zhuǎn)換為方法調(diào)用:

      public static void Main() {     var query = db.Cars.Select<Car, Car>(c => c);     foreach (Car aCar in query)     {          Console.WriteLine(aCar.Name);     } } 
    2. 如果 db.Cars 的類型是 IEnumerable<Car> (即它的 LINQ,對象),然后 lambda 表達(dá)式變成了一個單獨的方法:

      private Car lambda0(Car c) {     return c; } private Func<Car, Car> CachedAnonymousMethodDelegate1; public static void Main() {     if (CachedAnonymousMethodDelegate1 == null)         CachedAnonymousMethodDelegate1 = new Func<Car, Car>(lambda0);     var query = db.Cars.Select<Car, Car>(CachedAnonymousMethodDelegate1);     foreach // ... } 

      在現(xiàn)實中不調(diào)用該方法 lambda0 但東西喜歡 <Main>b__0 (在 Main 是包含方法的名稱)。同樣,緩存的委托實際上調(diào)用 CS$<>9__CachedAnonymousMethodDelegate1

      如果您正在使用 SQL LINQ 然后 db.Cars 類型將為 IQueryable<Car>,此步驟是非常不同。相反,它會到表達(dá)式目錄樹的 lambda 表達(dá)式:

      public static void Main() {     var parameter = Expression.Parameter(typeof(Car), "c");     var lambda = Expression.Lambda<Func<Car, Car>>(parameter, new ParameterExpression[] { parameter }));     var query = db.Cars.Select<Car, Car>(lambda);     foreach // ... } 
    3. foreach 循環(huán)變成一個 try/finally 塊 (這是相同的兩個):

      IEnumerator<Car> enumerator = null; try {     enumerator = query.GetEnumerator();     Car aCar;     while (enumerator.MoveNext())     {         aCar = enumerator.Current;         Console.WriteLine(aCar.Name);     } } finally {     if (enumerator != null)         ((IDisposable)enumerator).Dispose(); } 
    4. 最后,這是為 IL 編譯預(yù)期的方式。以下是為 IEnumerable<Car>

      // Put db.Cars on the stack L_0016: ldloc.0  L_0017: callvirt instance !0 DatabaseContext::get_Cars()   // “if” starts here L_001c: ldsfld Func<Car, Car> Program::CachedAnonymousMethodDelegate1 L_0021: brtrue.s L_0034 L_0023: ldnull  L_0024: ldftn Car Program::lambda0(Car) L_002a: newobj instance void Func<Car, Car>::.ctor(object, native int) L_002f: stsfld Func<Car, Car> Program::CachedAnonymousMethodDelegate1   // Put the delegate for “c => c” on the stack L_0034: ldsfld Func<Car, Car> Program::CachedAnonymousMethodDelegate1   // Call to Enumerable.Select() L_0039: call IEnumerable<!!1> Enumerable::Select<Car, Car>(IEnumerable<!!0>, Func<!!0, !!1>) L_003e: stloc.1   // “try” block starts here L_003f: ldloc.1  L_0040: callvirt instance IEnumerator<!0> IEnumerable<Car>::GetEnumerator() L_0045: stloc.3   // “while” inside try block starts here L_0046: br.s L_005a L_0048: ldloc.3   // body of while starts here L_0049: callvirt instance !0 IEnumerator<Car>::get_Current() L_004e: stloc.2  L_004f: ldloc.2  L_0050: ldfld string Car::Name L_0055: call void Console::WriteLine(string) L_005a: ldloc.3   // while condition starts here L_005b: callvirt instance bool IEnumerator::MoveNext() L_0060: brtrue.s L_0048  // end of while L_0062: leave.s L_006e   // end of try   // “finally” block starts here L_0064: ldloc.3  L_0065: brfalse.s L_006d L_0067: ldloc.3  L_0068: callvirt instance void IDisposable::Dispose() L_006d: endfinally  

      已編譯的代碼,IQueryable<Car> 版本是按預(yù)期也。這里是重要的部分,有別于上述 (本地變量會有不同的偏移和名稱現(xiàn)在,但讓我們忽略的):

      // typeof(Car) L_0021: ldtoken Car L_0026: call Type Type::GetTypeFromHandle(RuntimeTypeHandle)   // Expression.Parameter(typeof(Car), "c") L_002b: ldstr "c" L_0030: call ParameterExpression Expression::Parameter(Type, string) L_0035: stloc.3    // Expression.Lambda(...) L_0036: ldloc.3  L_0037: ldc.i4.1           // var paramArray = new ParameterExpression[1] L_0038: newarr ParameterExpression L_003d: stloc.s paramArray L_003f: ldloc.s paramArray L_0041: ldc.i4.0                    // paramArray[0] = parameter; L_0042: ldloc.3  L_0043: stelem.ref  L_0044: ldloc.s paramArray L_0046: call Expression<!!0> Expression::Lambda<Func<Car, Car>>(Expression, ParameterExpression[])   // var query = Queryable.Select(...); L_004b: call IQueryable<!!1> Queryable::Select<Car, Car>(IQueryable<!!0>, Expression<Func<!!0, !!1>>) L_0050: stloc.1  
    posted on 2013-02-06 14:49 墻頭草 閱讀(2482) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    人人游戲網(wǎng) 軟件開發(fā)網(wǎng) 貨運(yùn)專家
    主站蜘蛛池模板: 午夜免费福利视频| 插鸡网站在线播放免费观看| 亚洲精品免费网站| 亚洲视频网站在线观看| 中文字幕成人免费视频| 亚洲精品不卡视频| 99久久免费国产香蕉麻豆| 亚洲综合久久成人69| 1000部啪啪未满十八勿入免费| 亚洲av伊人久久综合密臀性色 | 成人特黄a级毛片免费视频| 国产a视频精品免费观看| 91在线手机精品免费观看| 亚洲成人国产精品| 无码免费一区二区三区免费播放| 国产在线观看免费观看不卡| 亚洲美女aⅴ久久久91| 一本久到久久亚洲综合| 亚洲色偷偷色噜噜狠狠99网| 久久精品无码一区二区三区免费| 中文字幕乱码亚洲无线三区| 免费网站看v片在线香蕉| 老司机免费午夜精品视频| 久久久久亚洲AV无码专区网站| 久久精品视频免费播放| 亚洲国产成人精品久久| 夜夜爽免费888视频| 一级毛片免费在线观看网站| 亚洲国产二区三区久久| 毛片免费在线播放| 人妻仑刮八A级毛片免费看| 亚洲AV永久无码精品| 成人毛片视频免费网站观看| 九九全国免费视频| 亚洲熟妇色自偷自拍另类| 国产高清在线免费视频| 久久99精品免费一区二区| 亚洲图片中文字幕| 亚洲国产精品日韩| 4hu四虎最新免费地址| 丰满妇女做a级毛片免费观看|