可能重复:
C# - List<T> or IList<T>
我有一个班级
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}
我需要定义一个列表,以下面的方式定义它之间有什么区别
IList<Employee> EmpList ;
Or
List<Employee> EmpList ;
答案 0 :(得分:9)
IList<>
是interface。 List<>
是一个具体的类。
其中任何一项都有效:
IList<Employee> EmpList = new List<Employee>();
和
List<Employee> EmpList = new List<Employee>();
或
var EmpList = new List<Employee>(); // EmpList is List<Employee>
但是,您无法实例化接口,即以下内容将失败:
IList<Employee> EmpList = new IList<Employee>();
通常,使用依赖项(如集合)的类和函数应指定可能的限制性最小的接口(即最常用的接口)。例如如果你的方法只需要迭代一个集合,那么IEnumerable<>
就足够了:
public void IterateEmployees(IEnumerable<Employee> employees)
{
foreach(var employee in employees)
{
// ...
}
}
如果消费者需要访问Count
属性(而不是必须通过Count()
迭代集合),那么ICollection<T>
或更好,IReadOnlyCollection<T>
会更合适,同样地,只有在需要通过IList<T>
随机访问集合或表示需要在集合中添加或删除新项目时才需要[]
。
答案 1 :(得分:5)
IList<T>
是由List<T>.
您无法创建接口的具体实例:
//this will not compile
IList<Employee> EmpList = new IList<Employee>();
//this is what you're really looking for:
List<Employee> EmpList = new List<Employee>();
//but this will also compile:
IList<Employee> EmpList = new List<Employee>();
答案 2 :(得分:5)
这里有两个答案。要存储实际列表,请使用List<T>
,因为您需要具体的数据结构。但是,如果您从属性返回它或将其作为参数,请考虑IList<T>
。它更通用,允许为参数传递更多类型。同样,在内部实现发生变化的情况下,它允许返回更多类型而不仅仅是List<T>
。实际上,您可能需要考虑返回类型IEnumerable<T>
。
答案 3 :(得分:2)
List
对象允许您创建列表,向其添加内容,删除它,更新它,索引它等等。只要您想要指定的通用List,就会使用List
它中的对象类型就是它。
IList
是一个接口。 (有关接口的更多信息,请参阅MSDN接口)。基本上,如果你想创建自己的List
类型,比如名为SimpleList的列表类,那么你可以使用Interface为你的新类提供基本的方法和结构。 IList
用于创建自己的特殊子类,用于实现List
。
You can see example here
答案 4 :(得分:1)
我会告诉你列举这些差异,也许还有一些漂亮的反思,但是List<T>
实现了几个接口,而IList<T>
只是其中之一:
[SerializableAttribute]
public class List<T> : IList<T>, ICollection<T>,
IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>,
IEnumerable
答案 5 :(得分:1)
有许多类型的列表。它们中的每一个都继承自IList(这就是它的界面)。两个示例是List(常规列表)和分页列表(这是一个支持分页的列表 - 它通常用于分页搜索结果)。分页列表和列表都是IList的类型,这意味着IList不是List(它可以是分页列表),反之亦然。
在PagedList上查看此链接。 https://github.com/TroyGoode/PagedList#readme
答案 6 :(得分:0)
IList是一个接口,List是一个实现它的类,List类型显式实现了非通用的IList接口
答案 7 :(得分:0)
第一个版本是对接口进行编程并且是首选(假设您只需要使用IList定义的方法)。第二个版本及其基于特定类的声明是不必要的僵化。
答案 8 :(得分:0)
区别在于IList是一个接口而List是一个类。 List实现IList,但IList无法实例化。