程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 數組為什麼可以使用linq查詢,數組可以使用linq

數組為什麼可以使用linq查詢,數組可以使用linq

編輯:C#入門知識

數組為什麼可以使用linq查詢,數組可以使用linq


問題引出

  這視乎是個完全不必要進行討論的話題,因為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方法,這是因為值類型的數組的內存布局與引用類型的數組不同。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved