可能重复:
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 ;
可能重复:
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 ;
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>
仅在需要通过随机访问集合时才需要[]
或表达需要从集合中添加或删除新项目。
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>();
这里有两个答案。要存储实际列表,请使用 an,List<T>
因为您需要具体的数据结构。但是,如果您从属性返回它或需要它作为参数,请考虑使用IList<T>
. 它更通用,允许为参数传递更多类型。同样,它允许返回更多类型,而不仅仅是List<T>
内部实现发生变化的情况。实际上,您可能需要考虑使用IEnumerable<T>
返回类型。
我将让您列举差异,也许有一些漂亮的反思,但 aList<T>
实现了几个接口,并且IList<T>
只是其中一个:
[SerializableAttribute]
public class List<T> : IList<T>, ICollection<T>,
IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>,
IEnumerable
List
对象允许您创建一个列表,向其中添加内容,删除它,更新它,索引到它等等。List
只要您只需要一个在其中指定对象类型的通用列表,就可以使用它。
IList
另一方面是一个接口。(有关接口的更多信息,请参阅 MSDN 接口)。基本上,如果你想创建自己的类型List
,比如一个名为 SimpleList 的列表类,那么你可以使用接口为你的新类提供基本的方法和结构。IList
用于当您想要创建自己的特殊子类时,实现List
.
您可以在此处查看示例
列表有很多种。它们中的每一个都继承自 IList(这就是它是接口的原因)。两个示例是列表(常规列表)和分页列表(这是一个支持分页的列表 - 它通常用于分页搜索结果)。Paged List 和 List 都是 IList 的类型,这意味着 IList 不一定是 List(它可以是 Paged List),反之亦然。
请参阅 PagedList 上的此链接。https://github.com/TroyGoode/PagedList#readme
区别在于 IList 是一个接口,而 List 是一个类。List 实现了 IList,但是 IList 不能被实例化。
IList is an interface, List is a class that implements it, the List type explicitly implements the non generic IList interface
第一个版本是针对接口编程的,是首选(假设您只需要使用 IList 定义的方法)。第二个版本,它的声明基于一个特定的类,是不必要的死板。