[英]What's the difference between IEnumerable and Array, IList and List?
[英]What is the difference between returning IList vs List, or IEnumerable vs List<Class>. I want to know which is better to return
返回IList vs List或IEnumerable vs List有什么區別。
我想知道哪個更好。
當我們需要使用一種時,它將對性能產生什么影響?
沒有這樣的類型總是可以更好地返回。 您應該根據設計/性能/等目標做出決定。
IEnumerable<T>
可以很好地用於表示項目序列,可以進行迭代,但是不想修改(添加,刪除等)。
IList<T>
為您提供了使用IEnumerable<T>
可以獲得的一切,以及使您可以更好地控制集合的操作:添加,刪除,計數,索引訪問等。
List<T>
是IList<T>
的具體實現。 我會說,幾乎總是最好從方法中公開IList<T>
接口,而不是List<T>
實現。 這不僅是關於列表的,這是一種基本的設計原則,它優先於接口而不是具體的實現。
好的,現在是關於非通用版本的IEnumerable, IList, List
:它們實際上來自.NET框架的早期版本,使用通用等效項會更好。
關於性能的幾句話: IEnumerable<T>
(帶有IEnumerator<T>
)實際上是一個迭代器,它允許您將某些計算推遲到以后。 這意味着不需要立即分配內存來存儲大量數據(當然,當迭代器后面有數組時,情況並非如此)。 您可以根據需要逐步計算數據。 但這意味着這些計算可能會一遍又一遍地執行(例如,對於每個foreach
循環)。 另一方面,使用List,您可以在內存中使用固定的數據進行廉價的Index和Count操作。 如您所見,這全都是妥協。
在參數和方法結果中使用具體的類會產生強烈的依賴性,而使用接口則不會。 什么意思?
如果將來您將更改類的實現,並使用SynchroinizedCollection
, LinkedList
或其他代替List
東西,那么您必須更改方法簽名,即返回值的類型。
之后,您不僅必須重建使用該類的程序集,還可能必須重寫它們。
但是,如果使用的是IEnumerable
, IReadonlyCollection
, ICollection
, IList
接口之一,則不必重寫和重新編譯客戶端程序集。 因此,接口始終是參數和結果中首選的類。 (但是請記住,我們正在談論的是不同程序集之間的依賴關系。對於同一程序集,此規則並不那么重要。)
問題是,使用什么接口? 這取決於客戶端類的要求(用例)。 例如,如果要一一處理元素,請使用IEnumerable<T>
;如果需要計數元素,請使用IReadonlyCollection<T>
。 這兩個接口都是協方差,便於類型轉換。
如果您需要寫能力( Add
, Remove
, Clear
)或非協方差只讀能力( Contains
),請使用ICollection<T>
。 最后,如果需要隨機索引訪問,請使用IList<T>
。
至於性能,接口方法的調用要慢一些,但是差別不大。 你不應該在乎這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.