我将用这个例子解释我的问题:
ICollection<Employee> listOfEmployee = new List<Employee>();
//listOfEmployee = Some code;
在c#中,List<T>
继承自IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>
接口。所以这意味着List<T>
具有这些intercafe所具有的所有方法。
在上面的例子中,为什么我们有时使用
ICollection<Employee> listOfEmployee = new List<Employee>();
或
IEnumerable<Employee> listOfEmployee = new List<Employee>();
等等……而不是
List<Employee> listOfEmployee = new List<Employee>();
吗?有什么性能上的好处吗?
一般来说,使用您需要的最简单的类型是很好的做法。从长远来看,如果您决定稍后更改更高级别的类型,它将更加灵活。例如,这可以在不更改代码的情况下工作:
ICollection<Employee> listOfEmployee = new List<Employee>();
...
listOfEmployee = new HashSet<Employee>();
如果您要像第二个示例那样使用最高级别的类:
List<Employee> listOfEmployee = new List<Employee>();
...
listOfEmployee = new HashSet<Employee>();
这将抛出编译时错误,即使您只使用ICollection<>接口。由于您不需要访问列表<>中获得的所有高级功能,因此使用ICollection<>更易于维护。
编辑:这也是一个很好的方式来表明你计划对你的对象使用什么类型的操作。如果您只打算遍历列表,那么IEnumerable可能是一种选择。但如果稍后要添加和插入对象,则可以在这里使用List
我建议你仔细阅读为什么我们使用接口和具体类型。在您的示例中,接口传达了使用者可以对集合执行的操作类型。IEnumerable
表示项只能迭代,而ICollection
允许在集合中插入和删除项。