`

C#中List与IList的区别(转)

    博客分类:
  • C#
阅读更多
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与IList的区别.,C#中List与IList的区别.,C#中List与IList的区别.

    C#的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的区别小结

    本篇文章主要是对C#中Ilist与list的区别进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    IList和List的区别

    已经有很多人讨论过IList和List的区别,恩,我也赞同其中的一些观点,其实他们二者也是有优有劣的,看你着重用在哪个方面,先贴一下我赞同的意见,基本上也都是网友们总结的。

    浅谈C#中ListT对象的深度拷贝问题

    一、List对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List&lt;T&gt; oldList = new List(); oldList.Add(..); List&lt;T&gt; newList = new List(oldList); 二、List对象中的T是引用...

    C# IList多字段排序

    对实现IList接口的类进行排序,支持多字段排序。

    C#中IEnumerable、ICollection、IList、List之间的区别

    主要介绍了C#中IEnumerable、ICollection、IList、List之间的区别,本文分别分析了它的实现源码,从而总结出了它们之间的关系和不同之处,需要的朋友可以参考下

    C#中IList&lt;T&gt;与List&lt;T&gt;的区别深入解析

    本篇文章主要是对C#中IList与List的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    C#中任意类型数据转成JSON格式

    List转成json public static string ListToJson(IList&lt;T&gt; list, string jsonName) { StringBuilder Json = new StringBuilder(); if (string.IsNullOrEmpty(jsonName)) jsonName = list[0].GetType().Name; ...

    list转化成JSON字符串

    可将list转化成JSON字符串 使用方法 例: List&lt;自定义类&gt; l; ListChangeToJson.ListChangeToJson classJson = new ListChangeToJson.ListChangeToJson(); classJson.ArrayToJsonAll(l, "数组名字");

    c#将list类型转换成DataTable方法示例

    代码如下:///  /// 将List转换成DataTable ///  /// ”T”&gt; /// ”data”&gt; /// &lt;returns&gt;&lt;/returns&gt; public static DataTable ToDataTable(this IList&lt;T&gt; data) { PropertyDescriptorCollection prope

    C# List介绍及具体用法

    集合是OOP中的一个重要概念,C#中对集合的全面支持更是该语言的精华之一。 为什么要用泛型集合? 在C# 2.0之前,主要可以通过两种方式实现集合: a.使用ArrayList 直接将对象放入ArrayList,操作直观,但由于集合中...

    C#中IListT与ListT的区别深入解析

    写代码时对:IList IList11 =new List ();List List11 =new List (); 有所疑惑,于是在网上搜索一下,很受启发,于是收藏下来,但对部分观点不敢苟同,用红色字体标明我的看法! 首先IList 泛型接口是 ICollection ...

    C# ListT的用法小结

    所属命名空间:System.Collections.Generic public class List&lt;T&gt; : IList, ICollection, IEnumerable, IList, ICollection, IEnumerable List类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数组...

    C#中怎么将一个List转换为只读的

    如题,主要使用AsReadOnly这个方法就可以了 代码如下:List&lt;int&gt; a = new List&lt;int&gt; {1, 2, 3, 4, 5}; IList&lt;int&gt; b = a.AsReadOnly(); // block modification… IList&lt;int&gt; c = b.AsWritable(); // … but unblock...

    C#实现DataTable,List和Json转换的方法

    本文实例讲述了C#实现DataTable,List和Json转换的方法。分享给大家供大家参考,具体如下: 1. 将DataTable或Ilist&lt;&gt;转换成JSON格式 using System; using System.Data; using System.Text; using System....

    C# Datagridview绑定List方法代码

    本文实例讲述了c# DatagridView绑定List的方法,分享给大家供大家参考。具体方法如下: 主要代码如下:  IList&lt;Person&gt; lists; public Form2() { InitializeComponent(); lists = new BindingList(); lists....

    ORM及代码生成器C#源码(2012最新版Kenly.DBFramework4.6.5.5)

    public static List&lt;T&gt; ToEntities(IList&lt;DataRow&gt; adaptedRows); public static List&lt;T&gt; ToEntities(DataTable table); public static T ToEntity(DataRow adaptedRow); public static string ToPropertyName...

Global site tag (gtag.js) - Google Analytics