IList <int> vs List <int> </int> </int>

时间:2009-09-02 12:55:10

标签: c#

你能帮助我理解这两者之间的实用差异;

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

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

7 个答案:

答案 0 :(得分:41)

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

只会公开接口IList

公开的方法
List<int> myList = new List<int>();

将公开List对象的所有成员

我不会在此列出所有差异,但您可以查看MSDN上的成员列表以获取每个成员列表的完整列表:

IList(T) Members
List(T) Members

答案 1 :(得分:13)

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

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的变量访问它们。如果你的变量是一个List,并且返回你想要的数据的方法返回了一个BindingList,那么你必须走硬路并将返回的BindingList的所有成员添加到一个新的List中,或者只写另一个方法。

答案 2 :(得分:4)

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

答案 3 :(得分:2)

如果您使用第二种形式,您将能够调用myList上属于List类的方法,但不能在没有强制转换的情况下调用IList接口的一部分。

如果您使用第一个表单,则可以将IList的其他实例分配给myList,以防您以后想要使用其他IList实现。

在决定使用哪一种时,最佳做法通常是使用具有所需功能的最通用形式。如果IList拥有您需要的所有方法,那么请使用它。如果IEnumerable拥有您需要的所有内容,那么您可能会更加通用并使用它。

答案 4 :(得分:1)

IList不会为您提供List所带来的所有功能。

IList是一个接口,由许多类似列表的类实现 - 其中一个类是列表。

答案 5 :(得分:1)

我会给你一个非常简单的例子

假设我们有一个类库,我们有class1作为类

它有两种方法

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;
}

现在正在使用类库。它发生的比你需要将Collection从List更改为Array或索引类型。

我们可以这样做

public IList getList()
{
    IList mylist=new int[10];
    lst[0] = 10;
    return mylist;
}

但我们不能这样做

public List getList()
{
    List mylist=new int[10];
    lst[0] = 10;
    return mylist;
}

答案 6 :(得分:-1)

您的第一个示例将可用作IList<int>而不使用as语法“强制转换”,而您的第二个示例也可用作{{1 }和IEnumerable<int>马上。