你能帮助我理解这两者之间的实用差异;
IList<int> myList = new List<int>();
List<int> myList = new List<int>();
答案 0 :(得分:41)
IList<int> myList = new List<int>();
只会公开接口IList
List<int> myList = new List<int>();
将公开List
对象的所有成员
我不会在此列出所有差异,但您可以查看MSDN上的成员列表以获取每个成员列表的完整列表:
答案 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>
马上。