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
语法进行“转换”,而您的第二个示例也可以立即用作IEnumerable
和ICollection
。