<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      【More Effective C#】LINQ表達式與方法調用的映射

      2010-10-15 08:05  空逸云  閱讀(982)  評論(2)    收藏  舉報

      LINQ構建在兩個概念之上,一種查詢語言和一系列將查詢語言轉換成方法調用的實現.在編譯時,編譯器將LINQ表達式(LINQ to object)轉換成方法調用.

      .Net基礎類庫提供了兩種擴展方法.System.Linq.Enumerable使用了IEnumerable<T>上擴展來實現,System.Linq.Queryable則提供了類似的一系列IQueryable<T>上的擴展.兩者的轉換略為不同.前者在編譯時轉換成相應的擴展方法調用.而后者則能將LINQ表達式轉換成SQL查詢,并有SQL數據庫引擎執行.

      LINQ表達式到方法調用的轉換時一個復雜的迭代過程.編譯器在轉換時也有一個特定的順序.

      例如

       int[] someNumbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

                  var answer = from n in someNumbers

                               where n < 5

                               select n;

      最后將轉換成

      int[] someNumbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

                  var answer =someNumbers.Where(n=>n<5);

      可以看到.在上面的轉換后.Select被優化去掉了.這就是一個退化選擇.不止是Where和Select.相應的LINQ表達式都會被轉換成相應的擴展方法..

      編譯器的轉換

      C#編譯器將把查詢和lambda表達式(Linq to object)轉換成靜態委托,實力委托和閉包.

      int[] someNumbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

                  var answer = from n in someNumbers

                               select n;

      把上邊的代碼編譯.使用Refletor打開程序集.查看生成的相關代碼.

       int[] someNumbers = new int[] { 0123456789 };

          if (CS$<>9__CachedAnonymousMethodDelegate1 == null)

          {

              CS$<>9__CachedAnonymousMethodDelegate1 = new Func<intint>(null, (IntPtr<Main>b__0);

          }

          IEnumerable<intanswer = Enumerable.Select<intint>(someNumbersCS$<>9__CachedAnonymousMethodDelegate1);

      可以看到.編譯器自動生成了一個委托.下面.使用更為直觀的代碼描述.生成的代碼大致如下:

       private static int HiddenFuc(int n)

              {

                  return n * n;

              }

              private static Func<intint> HiddenDelegateDefinition

       int[] someNumbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

                  if (HiddenDelegateDefinition == null)

                  {

                      HiddenDelegateDefinition = new Func<intint>(HiddenFuc);

                  }

                  IEnumerable<int> anser = someNumbers.Select<intint>(HiddenDelegateDefinition);

      可以看到.編譯器生成了一個靜態方法實現Select表達式.并且通過委托實現查詢.

      實際上.上述的lambda表達式的主體部分并沒有訪問任何實例變量或是局部變量.什么是實例變量.什么又是局部變量.?

      訪問實例變量的Lambe表達式

      public class ModFilter

          {

              private readonly int modulus;

              public ModFilter(int mod)

              {

                  modulus = mod;

              }

              public IEnumerable<int> FindValues(IEnumerable<int> sequence)

              {

                  return from n in sequence

                         where n % modulus == 0   //訪¤問實例變量

                         select n * n;

              }

          }

      編譯器將會為你生成一個實例方法,生成的代碼大致如下

       public class ModFilter

          {

              private readonly int modulus;

              public ModFilter(int mod)

              {

                  modulus = mod;

              }

              private bool WhereClause(int n)

              {

                  return (n % modulus) == 0;

              }

              private static int SelectClause(int n)

              {

                  return n * n;

              }

              private static Func<intint> SelectDelegate;

              public IEnumerable<int> FindValues(IEnumerable<int> sequence)

              {

                  if (SelectDelegate == null)

                  {

                      SelectDelegate = new Func<intint>(SelectClause);

                  }

                  return sequence.Where<int>(new Func<intbool>(this.WhereClause)).Select<intint>(SelectClause);

              }

      }

      Lambda表達式訪問實例變量

        若是Lambda表達式中訪問了外部方法的實例變量.則編譯器將自動生成一個私有的嵌套類型.

      public class ModFilterCloser

          {

              private readonly int modulus;

              public ModFilterCloser(int mod)

              {

                  modulus = mod;

              }

              public IEnumerable<int> FindValues(IEnumerable<int> sequence)

              {

                  int numValues = 0;

                  return from n in sequence

                         where n % modulus == 0

                         select n * n / ++numValues; //調用了方法外的局部變量numValues

              }

          }

      生成的代碼大致如下.

       public class ModFilterCloser

          {

              private sealed class Closure

              {

                  public ModFilterCloser outer;

                  public int numValues;

                  public int SelectClause(int n)

                  {

                      return (n * n) / ++this.numValues;

                  }

              }

              private readonly int modulus;

              public ModFilterCloser(int mod)

              {

                  modulus = mod;

              }

              private bool WhereClause(int n)

              {

                  return (n % modulus) == 0;

              }

              public IEnumerable<int> FindValues(IEnumerable<int> sequence)

              {

                  Closure c = new Closure();

                  c.outer = this;

                  c.numValues = 0;

                  return sequence.Where<int>(new Func<int,bool>(this.WhereClause)).Select<int,int>(c.SelectClause));

              }

          }

      LINQ to Sql 的實現

      最后.要注意到.以上的轉換實現都是在Linq to object中實現.IEnumberale<T>.LINQ to SQL 的轉換.編譯后可以看到.并沒發生任何變化.那是因為.只有在遍歷迭代時,延遲執行.LINQ to SQL Provider才將LINQ表達式轉換成SQL查詢.

      主站蜘蛛池模板: 色综合AV综合无码综合网站 | 国产一区二区三区四区激情| 亚洲欧美激情在线一区| 成人永久性免费在线视频| 欧美黑人添添高潮a片www| 亚洲欧洲日韩国内精品| 国产精品午夜剧场免费观看| 中文激情一区二区三区四区| 欧美成人精品| 99久久免费只有精品国产| 亚洲嫩模喷白浆在线观看| 精品国产中文字幕第一页| 国产专区一va亚洲v天堂| 在线精品国精品国产不卡| 国产一区二区不卡在线| 欧美黑人又粗又大又爽免费| 亚洲熟妇自偷自拍另类| 久久中文字幕一区二区| 高清精品一区二区三区| 疯狂做受xxxx高潮视频免费| 无遮无挡爽爽免费视频| 色综合色国产热无码一| 久久综合久中文字幕青草| 久久精品这里热有精品| 南投县| 中文字幕波多野不卡一区| 午夜爽爽爽男女免费观看影院| 亚洲熟女乱色一区二区三区| 谢通门县| 亚洲国产欧美在线人成| 韩国福利片在线观看播放| 最新亚洲av日韩av二区| 自慰无码一区二区三区| 中文字幕无码免费久久99| 四虎影视一区二区精品| 国产主播精品福利午夜二区| 精品国产一区二区三区性色| 成人午夜激情在线观看| 办公室强奷漂亮少妇视频| 亚洲成亚洲成网中文字幕| 国产午夜大地久久|