IList vs List

你能帮我理解这两者之间的实际差异吗?

IList myList = new List(); List myList = new List(); 

 IList myList = new List(); 

将仅公开由IList接口公开的方法

 List myList = new List(); 

将公开List对象的所有成员

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

IList(T)成员
列表(T)成员

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

 IList myList; if (x == true) myList = getBindngList(); else myList = getList(); public BindingList getBindingList() { // do important things... return new BindingList(); } public List getList() { // do important things... return new List(); } 

因为List和BindingList都实现了IList接口,所以可以通过类型为IList的变量访问它们。 如果你的变量是一个List,并且返回你想要的数据的方法返回了一个BindingList,那么你必须走硬路并将返回的BindingList的所有成员添加到一个新的List中,或者只写另一个方法。

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

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

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

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

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

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

我会举一个非常简单的例子

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

它有2种方法

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

您的第一个示例可用作IList而不使用as语法进行“转换”,而您的第二个示例也可以立即用作IEnumerableICollection