国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

數組為什么可以使用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方法,這是因為值類型的數組的內存布局與引用類型的數組不同。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 美姑县| 惠安县| 伊吾县| 凤庆县| 安溪县| 开鲁县| 澎湖县| 利辛县| 铜山县| 新营市| 宜宾市| 白城市| 昌乐县| 佛山市| 宜君县| 民丰县| 余庆县| 油尖旺区| 建平县| 达拉特旗| 修水县| 乐陵市| 田阳县| 富蕴县| 财经| 龙里县| 泉州市| 武城县| 利辛县| 农安县| 理塘县| 临沭县| 精河县| 且末县| 莆田市| 碌曲县| 碌曲县| 罗平县| 潮安县| 汉源县| 江孜县|