C#中IList<T>与List<T>的区别感想
写代码时对:
List List11 =new List ();
有所疑惑,于是在网上搜索一下,很受启发,于是收藏下来,但对部分观点不敢苟同,用红色字体标明我的看法!
首先IList 泛型接口是 ICollection 泛型接口的子代,并且是所有泛型列表的基接口。
它仅仅是所有泛型类型的接口,并没有太多方法可以方便实用,如果仅仅是作为集合数据的承载体,确实,IList可以胜任。
不过,更多的时候,我们要对集合数据进行处理,从中筛选数据或者排序。这个时候IList就爱莫能助了。
1、当你只想使用接口的方法时,ILis<>这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间.(既然子类是继承父类的子类又有自己的属性和方法,那么子类NEW出来后这些都应该有而且必须有的,不论放在父类的变量里面还是自身类型的变量里面,不然的话向上转型后再向下转型数据就会丢失喽,太可怕了!)
2、IList <>是个接口,定义了一些操作方法这些方法要你自己去实现,List <>是泛型类,它已经实现了IList <>定义的那些方法
IList IList11 =new List ();
List List11 =new List ();
这两行代码,从操作上来看,实际上都是创建了一个List对象的实例,也就是说,他们的操作没有区别。
只是用于保存这个操作的返回值变量类型不一样而已。
那么,我们可以这么理解,这两行代码的目的不一样。
List List11 =new List ();
是想创建一个List,而且需要使用到List的功能,进行相关操作。
而IList IList11 =new List ();
只是想创建一个基于接口IList的对象的实例,只是这个接口是由List实现的。所以它只是希望使用到IList接口规定的功能而已。
C#中List与IList的区别
List<T>类:表示可通过索引访问的对象的强类型列表,提供用于对列表进行搜索、排序和操作的方法。IList<T>接口:表示可按照索引单独访问的一组对象。
下面谈谈它们之间的区别:
首先,List<T>是一个类,IList<T>是一个接口。接口和类的区别是本质的,类是负责功能的实现,而接口则是负责功能的定义。所以它们的区别本质上也就是类和接口的区别。
具体来说,IList 泛型接口是 ICollection 泛型接口的子代,并且是所有泛型列表的基接口。它仅仅是所有泛型类型的接口,并没有太多方法可以方便实用,如果仅仅是作为集合数据的承载体,那么使用IList<T>完全可以胜任。但是更多的时候,我们要对集合数据进行处理,从中筛选数据或者排序。这个时候IList<T>就爱莫能助了。
1、当你只想使用接口的方法时,ILis<>这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间.
2、IList <>是个接口,定义了一些操作方法这些方法要你自己去实现
List <>是泛型类,它已经实现了IList <>定义的那些方法
IList <Class1> IList11 =new List <Class1>();
List <Class1> List11 =new List <Class1>();
这两行代码,从操作上来看,实际上都是创建了一个List<Class1>对象的实例,也就是说,他们的操作没有区别。
只是用于保存这个操作的返回值变量类型不一样而已。
那么,我们可以这么理解,这两行代码的目的不一样。
List <Class1> List11 =new List <Class1>();
是想创建一个List<Class1>,而且需要使用到List<T>的功能,进行相关操作。
而
IList <Class1> IList11 =new List <Class1>();
只是想创建一个基于接口IList<Class1>的对象的实例,只是这个接口是由List<T>实现的。所以它只是希望使用到IList<T>接口规定的功能而已。
再举一个例子,比如你要实现一个集合类,但是你认为添加的时候要做一下判断,不能重复,你可以这样做:
//方法1:
public class MyCollection1 : List<MyItem>
{
public new void Add(MyItem item)
{
if (this.Contains(item)) return;
base.Add(item);
}
}
//方法2:
public class MyCollection2 : IList<MyItem>
{
private List<MyItem> innerList = new List<MyItem>();
public void Add(MyItem item)
{
if (this.Contains(item)) return;
base.Add(item);
}
//实现n多的方法后,附带的,有个Add方法,实现即可,实现方法略
}
如果是从List继承而来,那我如果这样写,就能跳过检查了。但是不会调用你写的Add方法,而是调用List的Add方法。
MyCollection1 mc1 = new MyCollection1();
.....
System.Collection.IList listData = mc1;
listData.Add(listData[0]);
这样就不会执行你写的检查代码。但如果用下面方法,则会执行你写的Add方法:
MyCollection2 mc2 = new MyCollection2();
.....
System.Collection.IList listData = mc2;
listData.Add(listData[0]);
总之,正如那些高手说的:
接口实现松耦合...有利于系统的维护与重构...优化系统流程...
鼓励使用接口
这样可以实现功能和具体实现的分离
实现接口分离的原则
不是看实际需要用的
【转载备注】实际上,通常的情况下,List比IList好的多,不要理什么接口原则。
因为就算是架构师也也很难决定仅仅用接口而已。
本文探讨了C#中IList<T>接口与List<T>类的区别。IList<T>是泛型接口,提供基本的列表操作;而List<T>则是一个实现了IList<T>的泛型类,提供了丰富的列表操作方法。
401

被折叠的 条评论
为什么被折叠?



