2012-10-31 79 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

相关问题