IList <t>和List <t> </t> </t>之间的区别

时间:2012-09-11 12:20:04

标签: c# linq list

  

可能重复:
  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 ;

9 个答案:

答案 0 :(得分:9)

IList<>interfaceList<>是一个具体的类。

其中任何一项都有效:

 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用于创建自己的特殊子类,用于实现ListYou 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无法实例化。