麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

數組為什么可以使用linq查詢

2019-11-14 13:48:39
字體:
來源:轉載
供稿:網友

問題引出

  這視乎是個完全不必要進行討論的話題,因為linq(這里具體是linq to objects)本來就是針對集合類型的,數組類型作為集合類型的一種當然可以使用了。不過我還是想寫一下,這個問題源于QQ群里一位朋友的提問:.net的數組類型都隱式繼承了Array類,該類是一個抽象類,并且實現了IEnumerable、ICollection、IList接口。但linq的方法都是針對實現了IEnumerable<T>泛型接口的,Array類并沒有實現這些泛型接口,為什么可以使用這些方法呢?

  linq to objects的本質是通過擴展方法來實現集合的查詢,這些擴展方法定義在一個Enumerable的靜態類中。Enumerable類下的所有擴展方法的第一個參數都是IEnumerable<T> 類型,表示它可以通過IEnumerable<T>類型進行調用。

淺析數組類型

1. 所有數組類型都隱式派生自Array

  當我們定義一個FileStream[] 數組時,CLR會為當前的AppDomain創建一個FileStream[] 類型,該類型派生自 Array。所以數組是引用類型,在堆中分配內存空間。Array類是一個抽象類,定義了許多關于常用的實例方法和靜態方法,供所有的數組類型使用。例如常見的:Length屬性,CopyTo方法等等。

2. 所有的數組類型都隱式實現了IEnumerable<T>接口

  就如上面所所的,這是一個理所當然的問題,為了提高開發效率,數組類型理應可以使用linq進行查詢。但由于數組可以是多維數組或者非0基數組,所以Array類并沒有實現IEnumerable<T>、ICollection<T>、IList<T> 這幾個泛型接口,而只是實現了非泛型版本的。實際上,CLR會自動為一維的數組類型實現這些泛型接口(指定T類型參數的具體類型),并且還會為它們的父類實現。例如我們定義一個FileStream[] 數組類型,那么CLR會為我們創建如下的層次類型結構:

  

  由于CLR的隱式實現,才使我們可以將一維數組類型應用在需要IEnumerable<T>泛型接口的地方。

  按照上面的說法,我們可以將FileStream[] 類型的對象傳遞給如下的方法:

  void F1(IEnumerable<object> oEnumerable);

  void F2(ICollection<Stream> sCollection);

  void F3(IList<FileStream> fList);

  這是對于引用類型而言的,如果是值類型,則不為會它的基類實現這些接口。例如DateTimel類型(基類包括ValueType和Object),DateTime[]數組類型不能傳遞給上面的F1方法,這是因為值類型的數組的內存布局與引用類型的數組不同。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品午夜未成人免费观看 | 依依成人综合 | 日本羞羞的午夜电视剧 | 91九色精品国产 | 5xx免费看| 欧美性受xxx黑人xyx性爽 | 2019中文字幕在线播放 | 九九视屏 | 久草视频福利在线观看 | 国产亚洲美女精品久久久2020 | 亚洲爱爱网站 | 一区二区精品视频在线观看 | 免费看一级视频 | 亚洲一区在线免费视频 | 国产精品一区在线免费观看 | 成人av一区二区免费播放 | 91网站链接 | 在线成人一区二区 | 一区二区三区手机在线观看 | 精品亚洲福利一区二区 | 欧美视频黄色 | 在线免费观看精品 | 免费观看欧美一级片 | 国产成人在线视频播放 | 黑人三级毛片 | 国产91丝袜在线熟 | h视频免费在线 | 一级免费在线 | 色阁五月 | 久久久久久久一区二区 | 一区二区三区欧美在线 | 福利在线影院 | 91午夜免费视频 | 国产青草视频在线观看 | 亚洲码无人客一区二区三区 | 欧美一级毛片欧美一级成人毛片 | 免费看搡女人无遮挡的视频 | a级高清免费毛片av在线 | 欧美成人一区免费视频 | 欧美一级免费在线观看 | 毛片在哪里看 |