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作为返回类型。
- 在哪一点上我们需要使用ilist和list?我知道i list是一个接口,list继承这个接口。请参阅下面的示例-公共类测试
- @用户1521931这是一个设计问题。一般来说,我建议您在字段中使用List,在属性和参数中使用IList。
IList是List.实现的接口。
无法创建接口的具体实例,因此:
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 >(); |
- 是的,我同意,但我想知道根据我们需要决定使用哪种情况:listemployist=new list();i listemployist=new list();
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接口