关于c#:自定义集合使用IEnumerable与ICollection对比IList

Custom Collection using IEnumerable vs ICollection vs IList

我需要设计我自己的自定义GenericCollection类。现在,我有很多选择可以使用IEnumerableICollectionIList来派生它,后者提供了一些附加功能。

我有点困惑,如果我使用IEnumerable,我可能需要声明对象以实际保存集合,就像在本例中使用_list

1
2
3
4
5
public class GenericCollection<T> : IEnumerable<T>
{
    private List<T> _list;
    //...
}

但是,如果我使用ICollectionIList,我不需要声明List对象,因为它是隐式可用的。

1
2
3
4
5
6
public class GenericCollection<T> : IList<T>
{
    // no need for List object
    //private List<T> _list;
    //...
}

这两种方法在性能方面有什么区别?

在哪种情况下,每个场景都是首选的,尤其是在设计自己的集合时。我对性能优良的轻质系列感兴趣。我认为这可以通过使用IEnumerable来实现,但具体来说,还有一些强有力的理由来支持它呢?

我已经查看了一些现有的帖子,但没有一个提供所需的信息。

返回"ilist"与"icolection"与"collection"


IEnumerableICollectionIList(通常,任何带有I前缀的类型)都只是接口。它们允许您公开类将要执行的操作,但与继承类不同,接口不为您提供它们所说必须执行的任何操作的默认实现。

至于选择哪个界面,这里有一个快速指南:

  • IList是可以通过索引访问的ICollection
  • ICollection是一个IEnumerable,很容易访问AddRemoveCount等东西。
  • IEnumerable是任何可以枚举的东西,即使这些东西的列表在您枚举之前并不存在。

您可能希望为集合扩展(或作为运行大多数逻辑的私有字段保留)的一些类是ListCollection(实现IList,但更容易访问重写实现,请参见collectionvs list您应该在接口上使用什么?对于这两个)ObservableCollection或非列表的集合之间的巨大差异,如DictionaryHashSet。有关这些内容的更多信息,请查阅该类的msdn文档。


首先,您不必实际地在这些接口之间进行选择,如果有必要,您可以实现这三个接口。第二,实现IEnumerable不需要公开基础列表。您可以只实现使用基础列表的枚举器的方法。

性能方面,我怀疑会有很大的影响,把重点放在你需要的功能上。唯一确定的方法就是测量。


性能不太可能依赖于实现的接口。而是取决于处理器必须运行多少指令才能达到某个目标。如果实现IEnumerable并覆盖列表,则很可能会编写只向列表传播调用的add/remove/this[]方法,这会增加性能开销。因此,尽管我没有进行任何测量,但是继承方法可能会快一点。

然而,这些细节通常只对实时应用程序重要,因为它们非常需要节省每一个可能的CPU周期。埃里克·利珀特有一篇关于关注这些细节的伟大文章:http://blogs.msdn.com/b/ericlippet/archive/2003/10/17/53237.aspx。通常,您最好使用更适合应用程序的业务逻辑和架构的方法,而不是性能细节。