定义接口类型变量而不是派生 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
允许在集合中插入和删除项目。
我将用这个例子来解释我的问题:
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
允许在集合中插入和删除项目。