我需要设计自己的定制GenericCollection
类(class)。现在我有很多选择可以使用 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>
来实现但究竟如何以及一些强有力的理由一起去呢?
我查看了一些现有的帖子,但没有一个提供所需的信息。
最佳答案
IEnumerable
, ICollection
, 和 IList
(通常,任何带有 I
前缀的类型)都只是 interfaces .他们让你展示你的类(class)将做什么,但不像你 inherit一个类,接口(interface)不会为您提供他们说您必须做的任何事情的默认实现。
就选择哪个接口(interface)而言,这里有一个快速指南:
- 安
IList
是一个ICollection
可以通过索引访问。 - 安
ICollection
是一个IEnumerable
可以轻松访问Add
等内容,Remove
, 和Count
. - 安
IEnumerable
是任何可以枚举的事物,即使这些事物的列表在您枚举之前不存在。
您可能希望为您的集合扩展(或保留为运行大部分逻辑的私有(private)字段)的一些类是 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 文档。
关于c# - 使用 IEnumerable 与 ICollection 与 IList 的自定义集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13157122/