List<T>类:表示可通过索引访问的对象的强类型列表,提供用于对列表进行搜索、排序和操作的方法。
IList<T>接口:表示可按照索引单独访问的一组对象。
下面谈谈它们之间的区别:
首先,List<T>是一个类,IList<T>是一个接口。接口和类的区别是本质的,类是负责功能的实现,而接口则是负责功能的定义。所以它们的区别本质上也就是类和接口的区别。
具体来说,IList 泛型接口是 ICollection 泛型接口的子代,并且是所有泛型列表的基接口。它仅仅是所有泛型类型的接口,并没有太多方法可以方便实用,如果仅仅是作为集合数据的承载体,那么使用IList<T>完全可以胜任。但是更多的时候,我们要对集合数据进行处理,从中筛选数据或者排序。这个时候IList<T>就爱莫能助了。
1、当你只想使用接口的方法时,IList<>这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间.
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]);
总之,正如那些高手说的:
接口实现松耦合...有利于系统的维护与重构...优化系统流程...
鼓励使用接口
这样可以实现功能和具体实现的分离
实现接口分离的原则
不是看实际需要用的
分享到:
相关推荐
C#中List与IList的区别.,C#中List与IList的区别.,C#中List与IList的区别.
C#的lIST接口C#的lIST接口 C#的lIST接口C#的lIST接口C#的lIST接口 C#的lIST接口C#的lIST接口C#的lIST接口C#的lIST接口C#的lIST接口C#的lIST接口C#的lIST接口
本篇文章主要是对C#中Ilist与list的区别进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
已经有很多人讨论过IList和List的区别,恩,我也赞同其中的一些观点,其实他们二者也是有优有劣的,看你着重用在哪个方面,先贴一下我赞同的意见,基本上也都是网友们总结的。
一、List对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List<T> oldList = new List(); oldList.Add(..); List<T> newList = new List(oldList); 二、List对象中的T是引用...
对实现IList接口的类进行排序,支持多字段排序。
主要介绍了C#中IEnumerable、ICollection、IList、List之间的区别,本文分别分析了它的实现源码,从而总结出了它们之间的关系和不同之处,需要的朋友可以参考下
本篇文章主要是对C#中IList与List的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
List转成json public static string ListToJson(IList<T> list, string jsonName) { StringBuilder Json = new StringBuilder(); if (string.IsNullOrEmpty(jsonName)) jsonName = list[0].GetType().Name; ...
可将list转化成JSON字符串 使用方法 例: List<自定义类> l; ListChangeToJson.ListChangeToJson classJson = new ListChangeToJson.ListChangeToJson(); classJson.ArrayToJsonAll(l, "数组名字");
代码如下:/// /// 将List转换成DataTable /// /// ”T”> /// ”data”> /// <returns></returns> public static DataTable ToDataTable(this IList<T> data) { PropertyDescriptorCollection prope
集合是OOP中的一个重要概念,C#中对集合的全面支持更是该语言的精华之一。 为什么要用泛型集合? 在C# 2.0之前,主要可以通过两种方式实现集合: a.使用ArrayList 直接将对象放入ArrayList,操作直观,但由于集合中...
写代码时对:IList IList11 =new List ();List List11 =new List (); 有所疑惑,于是在网上搜索一下,很受启发,于是收藏下来,但对部分观点不敢苟同,用红色字体标明我的看法! 首先IList 泛型接口是 ICollection ...
所属命名空间:System.Collections.Generic public class List<T> : IList, ICollection, IEnumerable, IList, ICollection, IEnumerable List类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数组...
如题,主要使用AsReadOnly这个方法就可以了 代码如下:List<int> a = new List<int> {1, 2, 3, 4, 5}; IList<int> b = a.AsReadOnly(); // block modification… IList<int> c = b.AsWritable(); // … but unblock...
本文实例讲述了C#实现DataTable,List和Json转换的方法。分享给大家供大家参考,具体如下: 1. 将DataTable或Ilist<>转换成JSON格式 using System; using System.Data; using System.Text; using System....
本文实例讲述了c# DatagridView绑定List的方法,分享给大家供大家参考。具体方法如下: 主要代码如下: IList<Person> lists; public Form2() { InitializeComponent(); lists = new BindingList(); lists....
public static List<T> ToEntities(IList<DataRow> adaptedRows); public static List<T> ToEntities(DataTable table); public static T ToEntity(DataRow adaptedRow); public static string ToPropertyName...