Custom Collection using IEnumerable vs ICollection vs IList
我需要设计我自己的自定义
我有点困惑,如果我使用
1 2 3 4 5 | public class GenericCollection<T> : IEnumerable<T> { private List<T> _list; //... } |
但是,如果我使用
1 2 3 4 5 6 | public class GenericCollection<T> : IList<T> { // no need for List object //private List<T> _list; //... } |
这两种方法在性能方面有什么区别?
在哪种情况下,每个场景都是首选的,尤其是在设计自己的集合时。我对性能优良的轻质系列感兴趣。我认为这可以通过使用
我已经查看了一些现有的帖子,但没有一个提供所需的信息。
返回"ilist"与"icolection"与"collection"
至于选择哪个界面,这里有一个快速指南:
IList 是可以通过索引访问的ICollection 。ICollection 是一个IEnumerable ,很容易访问Add 、Remove 和Count 等东西。IEnumerable 是任何可以枚举的东西,即使这些东西的列表在您枚举之前并不存在。
您可能希望为集合扩展(或作为运行大多数逻辑的私有字段保留)的一些类是
首先,您不必实际地在这些接口之间进行选择,如果有必要,您可以实现这三个接口。第二,实现IEnumerable不需要公开基础列表。您可以只实现使用基础列表的枚举器的方法。
性能方面,我怀疑会有很大的影响,把重点放在你需要的功能上。唯一确定的方法就是测量。
性能不太可能依赖于实现的接口。而是取决于处理器必须运行多少指令才能达到某个目标。如果实现IEnumerable并覆盖列表,则很可能会编写只向列表传播调用的add/remove/this[]方法,这会增加性能开销。因此,尽管我没有进行任何测量,但是继承方法可能会快一点。
然而,这些细节通常只对实时应用程序重要,因为它们非常需要节省每一个可能的CPU周期。埃里克·利珀特有一篇关于关注这些细节的伟大文章:http://blogs.msdn.com/b/ericlippet/archive/2003/10/17/53237.aspx。通常,您最好使用更适合应用程序的业务逻辑和架构的方法,而不是性能细节。