7

可能重复:
C# - List<T> 或 IList<T>

我有一堂课

 public class Employee
 {
      public int Id { get; set; }
      public string Name { get; set; }
 }

我需要定义一个列表,用以下方式定义它有什么区别

IList<Employee> EmpList ;

Or

List<Employee> EmpList ;
4

9 回答 9

12

IList<>是一个接口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>();

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

public void IterateEmployees(IEnumerable<Employee> employees)
{
   foreach(var employee in employees)
   {
     // ...
   }
}

然而,如果消费者需要访问该Count属性(而不是必须通过 迭代集合Count()),那么 aICollection<T>或更好,IReadOnlyCollection<T>将更合适,同样,IList<T>仅在需要通过随机访问集合时才需要[]或表达需要从集合中添加或删除新项目。

于 2012-09-11T12:25:22.623 回答
7

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>();
于 2012-09-11T12:24:54.647 回答
6

这里有两个答案。要存储实际列表,请使用 an,List<T>因为您需要具体的数据结构。但是,如果您从属性返回它或需要它作为参数,请考虑使用IList<T>. 它更通用,允许为参数传递更多类型。同样,它允许返回更多类型,而不仅仅是List<T>内部实现发生变化的情况。实际上,您可能需要考虑使用IEnumerable<T>返回类型。

于 2012-09-11T12:25:42.967 回答
2

我将让您列举差异,也许有一些漂亮的反思,但 aList<T>实现了几个接口,并且IList<T>只是其中一个:

[SerializableAttribute]
public class List<T> : IList<T>, ICollection<T>, 
    IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, 
    IEnumerable
于 2012-09-11T12:24:35.940 回答
2

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

IList另一方面是一个接口。(有关接口的更多信息,请参阅 MSDN 接口)。基本上,如果你想创建自己的类型List,比如一个名为 SimpleList 的列表类,那么你可以使用接口为你的新类提供基本的方法和结构。IList用于当您想要创建自己的特殊子类时,实现List. 您可以在此处查看示例

于 2012-09-11T12:28:01.977 回答
1

列表有很多种。它们中的每一个都继承自 IList(这就是它是接口的原因)。两个示例是列表(常规列表)和分页列表(这是一个支持分页的列表 - 它通常用于分页搜索结果)。Paged List 和 List 都是 IList 的类型,这意味着 IList 不一定是 List(它可以是 Paged List),反之亦然。

请参阅 PagedList 上的此链接。https://github.com/TroyGoode/PagedList#readme

于 2012-09-11T12:34:04.063 回答
0

区别在于 IList 是一个接口,而 List 是一个类。List 实现了 IList,但是 IList 不能被实例化。

于 2012-09-11T12:25:32.960 回答
0

IList is an interface, List is a class that implements it, the List type explicitly implements the non generic IList interface

于 2012-09-11T12:24:16.173 回答
0

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

于 2012-09-11T12:24:19.013 回答