关于C#:IList vs List


IList<int> vs List<int>

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

你能帮助我理解这两者的实际区别吗?

1
2
3
IList<int> myList = new List<int>();

List<int> myList = new List<int>();


1
IList<int> myList = new List<int>();

只公开接口IList公开的方法

1
List<int> myList = new List<int>();

将暴露List对象的所有成员

我不会在这里列出所有的差异,但是您可以查看msdn上的成员列表,以获得每个成员的完整列表:

ilist(t)成员
列表(t)成员


当你这样做的时候,真正的区别更容易看到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
IList<int> myList;

if (x == true)
    myList = getBindngList();
else
    myList = getList();


public BindingList<int> getBindingList()
{
    // do important things...
    return new BindingList<int>();
}

public List<int> getList()
{
    // do important things...
    return new List<int>();
}

因为list和bindinglist都实现了ilist接口,所以可以通过类型为ilist的变量访问它们。如果您的变量是一个列表,并且返回所需数据的方法返回了一个bindingList,那么您必须走上艰难的道路,将返回的bindingList的所有成员添加到一个新列表中,或者只编写另一个方法。


基本上,IList<>可以通过任何类(其中一个是List<>类)实现。因此,使用IList<>作为参数和属性会使耦合更加松散,这通常是一件好事,因为您不局限于一个特定的实现。


如果使用第二个表单,则可以调用属于List类的MyList上的方法,但不能在没有强制转换的情况下调用IList接口的一部分。

如果使用第一个表单,则可以将IList的其他实例分配给MyList,以备以后要使用不同的IList实现时使用。

在决定使用哪一个表单时,最佳实践通常是使用尽可能通用的表单,该表单具有您需要的所有功能。如果ilist拥有您需要的所有方法,那么就使用它。如果IEnumerable拥有您所需要的一切,那么您可以更通用,并使用它来代替。


我给你举个很简单的例子

假设我们有一个类库,而且我们有一个教室作为教室。

它有两种方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public IList getList()
{
    IList mylist=new List();
    mylist.add("hello");
    mylist.add("hi");
    return mylist;
}

public List getList()
{
List mylist=new List();
mylist.add("hello");
mylist.add("hi");
return mylist;
}

现在,当类库被使用时。发生这种情况时,您不需要将集合从列表更改为数组或索引类型。

我们可以这样做

1
2
3
4
5
6
public IList getList()
{
    IList mylist=new int[10];
    lst[0] = 10;
    return mylist;
}

但我们不能这样做

1
2
3
4
5
6
public List getList()
{
    List mylist=new int[10];
    lst[0] = 10;
    return mylist;
}

我不会给你列表中所有的功能。

IList是一个接口,由许多类似列表的类实现,这些类就是列表中的一个。


第一个示例只能用作IList,而不使用as语法进行"强制转换",而第二个示例也可以立即用作IEnumerableICollection