关于C#:IList vs List之间的区别

Difference between IList<T> and List<T>

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
C# - List or IList

我有一节课

1
2
3
4
5
 public class Employee
 {
      public int Id { get; set; }
      public string Name { get; set; }
 }

我需要定义一个列表,用下面的方法定义它有什么区别

1
2
3
4
5
IList<Employee> EmpList ;

Or

List<Employee> EmpList ;

IList<>是一个接口。List<>是一个具体的类别。

其中任何一个都是有效的:

1
 IList<Employee> EmpList = new List<Employee>();

1
 List<Employee> EmpList = new List<Employee>();

1
 var EmpList = new List<Employee>(); // EmpList is List<Employee>

但是,不能实例化接口,即以下操作将失败:

1
IList<Employee> EmpList = new IList<Employee>();

通常,使用依赖项(如集合)的类和函数应指定尽可能限制最少的接口(即最一般的接口)。例如,如果您的方法只需要迭代一个集合,那么一个IEnumerable<>就足够了:

1
2
3
4
5
6
7
public void IterateEmployees(IEnumerable<Employee> employees)
{
   foreach(var employee in employees)
   {
     // ...
   }
}

然而,如果消费者需要访问Count财产(而不是必须通过Count()迭代集合),那么ICollection或更好,IReadOnlyCollection将更为合适,同样,只有在需要通过[]随机访问集合或表达新的集合时,才需要IList才能使用。需要从集合中添加或删除MS。


这里有两个答案。要存储实际列表,请使用List,因为您需要一个具体的数据结构。但是,如果您从一个属性返回它或者要求它作为一个参数,那么考虑一个IList。它更通用,允许为参数传递更多类型。同样,它允许在内部实现更改的情况下返回更多的类型,而不仅仅是List。实际上,您可能会考虑将IEnumerable作为返回类型。


IListList.实现的接口。

无法创建接口的具体实例,因此:

1
2
3
4
5
6
7
8
//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>();


List对象允许您创建一个列表,向其添加内容,删除它,更新它,索引到它等等。当您只需要一个通用列表,在其中指定对象类型,就可以使用List

另一方面,IList是一个接口。(有关接口的更多信息,请参阅msdn接口)。基本上,如果您想创建自己类型的List,比如说一个名为simpleList的列表类,那么您可以使用该接口为新类提供基本的方法和结构。IList用于创建自己的、实现List的特殊子类。您可以在这里看到示例


有许多类型的列表。它们中的每一个都继承自一个IList(这就是为什么它是一个接口)。两个例子是列表(常规列表)和分页列表(这是一个支持分页的列表-它通常用于分页搜索结果)。分页列表和列表都是IList类型,这意味着不需要列表(它可以是分页列表),反之亦然。

请在页面列表中查看此链接。https://github.com/troygoode/pagedlist自述


我将让您列举这些差异,也许会进行一些巧妙的思考,但是一个List实现了几个接口,而IList只是其中之一:

1
2
3
4
[SerializableAttribute]
public class List<T> : IList<T>, ICollection<T>,
    IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>,
    IEnumerable


区别在于ilist是一个接口,list是一个类。列表实现了IList,但无法实例化IList。


第一个版本是编程到接口,并且是首选的(假设您只需要使用由IList定义的方法)。第二个版本的声明基于一个特定的类,它是不必要的死板。


ilist是接口,list是实现它的类,list类型显式实现非泛型ilist接口