定义接口类型变量而不是派生 class 类型的目的是什么?

What is the purpose of defining an interface type variable instead derived class type?

我将用这个例子来解释我的问题:

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> 拥有这些网吧拥有的所有方法。

在上面的这个例子中为什么我们有时使用

ICollection<Employee> listOfEmployee = new List<Employee>();

IEnumerable<Employee> listOfEmployee = new List<Employee>();

等...而不是

List<Employee> listOfEmployee = new List<Employee>();

这个?有什么性能优势吗?

一般来说,最好使用您需要的最简单的类型。如果您决定稍后更改更高级别的类型,它在 long 运行 中更灵活。例如,这可以在不更改代码的情况下工作:

ICollection<Employee> listOfEmployee = new List<Employee>();
...
listOfEmployee = new HashSet<Employee>();

如果您要像第二个示例那样使用最高级别 class:

List<Employee> listOfEmployee = new List<Employee>();
...
listOfEmployee = new HashSet<Employee>();

这会引发 compile-time 错误,即使您只使用 ICollection<> 接口中的方法也是如此。由于您不需要访问在 List<> 中获得的所有 higher-level 功能,因此使用 ICollection<> 更易于维护。

编辑:这也是表明您计划对对象使用何种类型操作的好方法。如果您只想遍历列表,那么 IEnumerable 可能是可行的方法。但是如果你想稍后添加和插入对象,那么你可以在那里使用 List

我建议您仔细阅读为什么我们使用接口而不是具体类型。在您的示例中,接口传达了消费者可以对集合执行的操作类型等。 IEnumerable 表示项目只能迭代,而 ICollection 允许在集合中插入和删除项目。