我需要设计自己的自定义GenericCollection
课程。现在我有很多选项可以使用IEnumerable
,ICollection
和IList
来推导它,后面会提供一些附加功能。
我很困惑,如果我使用IEnumerable<T>
,我可能需要声明对象实际上保存集合,就像在这种情况下_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>
实现,但是如何与一些强有力的理由一起使用呢?
我已查看了一些现有帖子,但没有提供所需信息。
答案 0 :(得分:44)
IEnumerable
,ICollection
和IList
(通常,任何带有I
前缀的类型)都只是interfaces。它们让你揭露你的类会做什么,但与你inherit类不同,接口不会为你提供他们说你必须做的任何事情的默认实现。
至于选择哪个界面,这是一个快速指南:
IList
是可以通过索引访问的ICollection
。ICollection
是IEnumerable
,可以轻松访问Add
,Remove
和Count
等内容。IEnumerable
是可以枚举的任何内容,即使这些内容的列表在您枚举之前不存在。您可能希望扩展(或保留为运行大多数逻辑的私有字段)的某些类是List<T>
,Collection<T>
,(实现IList<T>
,但是,通过更轻松地访问覆盖实施,请参阅Collection<T> versus List<T> what should you use on your interfaces?,了解这两者之间的巨大差异)ObservableCollection<T>
或非{(1}}和Dictionary<T, U>
列表的集合。有关其中任何一项的更多信息,请查阅该课程上的MSDN文档。
答案 1 :(得分:1)
首先,您不必实际选择这些接口,如果有必要,您可以实现这三个接口。其次,实现IEnumerable并不要求您公开底层列表。您只需实现方法即可使用基础列表的枚举器。
Performancewise,我怀疑会产生多大的影响,专注于你在功能上需要什么。确切知道的唯一方法是衡量。
答案 2 :(得分:0)
性能不太可能取决于实现哪些接口。它取决于处理器为实现某个目标而必须运行多少指令。如果您实现IEnumerable并包裹List,您可能最终会编写Add / Remove / this []方法,这些方法只是将调用传播到List,这会增加性能开销。因此,尽管我没有进行任何测量,但继承方法可能会更快一些。
但是,这些细节通常仅适用于需要节省每个可能的CPU周期的实时应用程序。 Eric Lippert有一篇关于关注这些细节的精彩文章:http://blogs.msdn.com/b/ericlippert/archive/2003/10/17/53237.aspx。通常,您可能会更好地使用更适合应用程序的业务逻辑和体系结构的方法,而不是性能详细信息。