IList<int> vs List<int>
你能帮助我理解这两者的实际区别吗?
1 2 3
| IList <int> myList = new List <int>();
List <int> myList = new List <int>(); |
- 但在c中,string s ="x"和object o ="x"之间存在差异。查看以下所有答复…
- stackoverflow.com/questions/764748/&hellip;
- @托马斯:我的观点是:这只是面向对象语言中基本区别的一个特例。你不应该把它视为特殊情况。一般来说,您应该掌握接口的概念以了解原因。
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语法进行"强制转换",而第二个示例也可以立即用作IEnumerable和ICollection。
- 错了。IList<>继承自ICollection<>,后者继承自IEnumerable<>。因此,这些也"立即可用"。
- 铸造(不需要报价),不必做与as关键字。事实上,像EDOCX1[1]这样的东西特别糟糕,因为您在交易一个可能的invalidcastexception,它告诉问题是什么,对于一个nullreferenceexception,它是误导性的。