2012-10-31 121 views
18

我需要設計我自己定製的GenericCollection類。現在我有很多選項可以使用IEnumerable,ICollectionIList來推導它,後面提供了一些附加功能。使用IEnumerable與ICollection與IList的自定義集合

我有點困惑,如果我去IEnumerable<T>我可能需要聲明的對象實際上舉行集合,在這種情況下_list_list

public class GenericCollection<T> : IEnumerable<T> 
{ 
    private List<T> _list; 
    //... 
} 

但是,如果我用ICollection<T>IList<T>去,我不需要申報List對象,因爲它是隱含可用。

public class GenericCollection<T> : IList<T> 
{ 
    // no need for List object 
    //private List<T> _list; 
    //... 
} 

是什麼相對於這兩種方法來性能之間的區別?

在哪種情況下,每個人都傾向於設計自己的收藏集。我對輕量級系列產品感興趣,性能良好。我認爲這可以通過使用IEnumerable<T>來實現,但是究竟有多強烈的理由會如何呢?

我回顧了一些現有的帖子,但沒有提供所需的信息。

Returning 'IList' vs 'ICollection' vs 'Collection'

+0

在第一個示例中,您不需要有_list成員。此外,你還需要實現一些存儲機制,以便繼承IList並實現IList的公共接口 –

回答

37

IEnumerableICollection,和IList(通常,任何類型的具有I前綴)只是interfaces。他們讓你公開你的課程將做什麼,但不像你是一個類,接口不會爲你提供他們說你必須做的任何事情的默認實現。

至於選擇哪個界面,這裏有一個快速指南:

  • IListICollection可以通過索引訪問。
  • ICollection是一個IEnumerable可以很容易地訪問像Add,RemoveCount的東西。
  • IEnumerable是可以枚舉的任何東西,即使這些東西的列表在你列舉之前不存在。

,你可能要擴展(或保留爲運行大多數邏輯私有字段)爲您收集的List<T>Collection<T>,(實現IList<T>,但壓倒一切的實現更輕鬆地訪問,看到一些類Collection<T> versus List<T> what should you use on your interfaces?爲這兩個之間的巨大差異)ObservableCollection<T>,或不是列表的集合,如Dictionary<T, U>HashSet<T>。有關這些信息的更多信息,請查閱該課程上的MSDN文檔。

0

性能不太可能是依賴於哪些接口實現。它取決於處理器運行多少條指令來實現特定目標。如果您實現IEnumerable並將其包裝在List上,那麼您最終可能會編寫將這些調用傳播到List的Add/Remove/this []方法,這會增加性能開銷。因此,雖然我沒有采取任何措施,但繼承方式可能會快一點。

但是,這些細節通常只針對實時應用程序,極其需要保存每個可能的CPU週期。 Eric Lippert有一篇關於關注這些細節的文章:http://blogs.msdn.com/b/ericlippert/archive/2003/10/17/53237.aspx。通常,使用更適合應用程序業務邏輯和體系結構的方法,而不是性能細節,您可能會更好。

1

首先,您不必在這些界面之間進行實際選擇,如果有必要,您可以實現這三個界面。其次,實現IEnumerable並不需要公開基礎列表。您只能實現使用底層列表的枚舉器的方法。

從表現上看,我懷疑會有什麼影響,專注於你需要的功能。要確定的唯一方法就是衡量。

+0

我錯誤地添加了公共列表,謝謝指出。實現所有三個接口有什麼用處?如果我只專注於功能,那麼我還可以與列表一起添加並準備好提供功能。但我正在尋找一些有力的理由去IEnumerable ,如果有的話? –

+0

看到Ilist實現了IEnumerable,如果實現IList,則不需要明確實現它。我只是想說這不是一個問題。 – Rik

相關問題