簡體   English   中英

返回IList與List或IEnumerable與List有什么區別 <Class> 。 我想知道哪個更好

[英]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操作。 如您所見,這全都是妥協。

在參數和方法結果中使用具體的類會產生強烈的依賴性​​,而使用接口則不會。 什么意思?

如果將來您將更改類的實現,並使用SynchroinizedCollectionLinkedList或其他代替List東西,那么您必須更改方法簽名,即返回值的類型。

之后,您不僅必須重建使用該類的程序集,還可能必須重寫它們。

但是,如果使用的是IEnumerableIReadonlyCollectionICollectionIList接口之一,則不必重寫和重新編譯客戶端程序集。 因此,接口始終是參數和結果中首選的類。 (但是請記住,我們正在談論的是不同程序集之間的依賴關系。對於同一程序集,此規則並不那么重要。)

問題是,使用什么接口? 這取決於客戶端類的要求(用例)。 例如,如果要一一處理元素,請使用IEnumerable<T> ;如果需要計數元素,請使用IReadonlyCollection<T> 這兩個接口都是協方差,便於類型轉換。

如果您需要寫能力( AddRemoveClear )或非協方差只讀能力( Contains ),請使用ICollection<T> 最后,如果需要隨機索引訪問,請使用IList<T>

至於性能,接口方法的調用要慢一些,但是差別不大。 你不應該在乎這個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM