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是两种常见的数据结构,它们都用于存储和管理对象的集合,但它们在概念和用途上有显著的差异。让我们深入探讨这两种类型的特性和区别。 首先,List是一个具体的类,它是.NET框架System....
在C#编程中,`List<T>`是.NET框架中常用的一种动态数组,它属于泛型集合,提供了丰富的功能,使得在处理一系列数据时更加灵活高效。`List<T>`类是`System.Collections.Generic`命名空间的一部分,它实现了`IList<T>`...
在这段代码中,我们创建了两个集合,一个是`List<TestClass>`,另一个是`IList<TestClass>`,但实际上是同一个`List<TestClass>`的实例。然后我们向这两个集合中添加了10000000个元素,并通过循环查找Id在1到1000...
在C#编程中,处理JSON数据是常见的任务,特别是在与Web服务交互或存储/检索配置信息时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。本文将深入...
这个压缩包"**C#将List与xml互转_支持简单类型.rar**"包含了一个示例文本文件"**C#将List与xml互转_支持简单类型.txt**"和一个可能用于测试的数据文件"**1.xls**"。 首先,让我们理解List和XML的基本概念。List是...
总结起来,C#中对`IList<T>`排序通常涉及`Array.Sort()`、`List<T>.Sort()`、`Enumerable.OrderBy()`等方法,以及可能需要实现`IComparable<T>`或`IComparer<T>`接口。根据具体需求选择合适的方法,可以有效地对列表...
在C#编程中,`IList<T>` 和 `List<T>` 都是非常常见的集合类型,它们在处理数据列表时有着不同的特性和用途。本文将详细阐述两者之间的主要区别,并给出在实际开发中如何选择和使用它们的建议。 首先,`IList<T>` ...
### C#中的IList接口详解 #### 一、引言 在C#中,`IList`接口是.NET Framework集合框架的重要组成部分之一。它提供了一种灵活的方式来存储和操作对象集合,支持索引访问和迭代等功能。本文将详细介绍`IList`接口的...
在C#编程中,`IList<T>`是一个接口,它扩展了`ICollection<T>`和`IEnumerable<T>`,提供了对列表的动态数据操作能力,比如添加、删除和索引访问元素。`IList<T>`接口是许多集合类型的基接口,如`List<T>`。在实际...
IList是.NET Framework中System.Collections.Generic命名空间下的一个接口,它是List类的基接口。IList接口继承自ICollection和IEnumerable,并添加了一些额外的方法和属性,如Insert、RemoveAt等,使我们可以对列表...
在C#编程中,`IList<T>`和`List<T>`是两个常见的泛型集合类,它们在使用上有显著的差异。本文将深入探讨这两个类的区别,并解释在何时选择使用它们。 首先,`IList<T>`是一个接口,它是`ICollection<T>`的子接口,...
在C#编程语言中,`IEnumerable<T>`、`ICollection<T>`、`IList<T>`以及`List<T>`是四个常见的接口和类,它们都与集合操作密切相关,但各自具有不同的特性和用途。以下是对这些概念的详细解释: 1. **IEnumerable**...
一、List对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List<T> oldList = new List(); oldList.Add(..); List<T> newList = new List(oldList); 二、List对象中的T是引用...
在.NET框架中,C#提供了多种数据集合类用于存储和管理对象,其中`ObservableCollection`和`List<T>`是两种常见的类型。它们都是用于创建可变列表,但有着不同的应用场景和特性。 首先,我们来详细了解`List<T>`。`...
Json转换为实体;Json转换为IList;实体转换为Json;IList转换为Json;
在本篇文章中,我们将深入探讨如何使用C#中的List集合动态地绑定到TreeView控件上。这种方法在构建具有层级结构的应用程序时非常有用,尤其是在处理组织结构、文件系统或者任何类型的树状数据时。 ### 一、理解...
在C#编程中,`IList<T>`是.NET框架中的一种接口,它是`IList`接口的泛型版本,提供了对列表数据的操作方法。当我们处理一个`IList<T>`对象时,有时候需要确保添加的元素不与现有元素重复,以保持列表的唯一性。这个...
C# List是一种泛型集合类,属于System.Collections.Generic命名空间,实现了IList、ICollection、IEnumerable、IList、ICollection、IEnumerable接口。List类是ArrayList类的泛型等效类,使用大小可按需动态增加的...
首先,我们需要了解C#中的列表类型`List<T>`。`List<T>`是.NET框架提供的一个泛型类,它实现了`IList<T>`、`ICollection<T>`和`IEnumerable<T>`接口,提供了动态数组的功能,允许我们方便地添加、删除和查找元素。...