原文:

探讨Ilist<>与List<>

首先要了解一点的是关于接口的基础知识:

接口不能直接实例化
但是接口派生出来的抽象类可以实例化
所有派生出来的抽象类都可以强制转换成接口的实例

第三条我解释一下:比如,IList <Class> IList11 =new List <Class>(); 也就是接口派生出来的抽象类可以转换为接口的实例,这也是常说的里氏替换原则(子类对象可以代替父类对象,但其父类对象不能代替子类对象)

首先,List<T>是一个类,IList<T>是一个接口。接口和类的区别是本质的,类是负责功能的实现,而接口则是负责功能的定义。所以它们的区别本质上也就是类和接口的区别。

具体来说,IList 泛型接口是 ICollection 泛型接口的子代,并且是所有泛型列表的基接口。它仅仅是所有泛型类型的接口,并没有太多方法可以方便实用,如果仅仅是作为集合数据的承载体,那么使用IList<T>完全可以胜任。但是更多的时候,我们要对集合数据进行处理,从中筛选数据或者排序。这个时候IList<T>就爱莫能助了。

1、当你只想使用接口的方法时,ILis<>这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间.

2、IList <>是个接口,定义了一些操作方法这些方法要你自己去实现

List <>是泛型类,它已经实现了IList <>定义的那些方法

IList <Class1> IList11 =new List <Class1>(); //这里是第三条规则的体现,实现低耦合,毕竟接口属最底层吧。IList1对象可以指向任意一个IList接口的实现

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]);

总之,正如那些高手说的:

接口实现低耦合...有利于系统的维护与重构...优化系统流程...

鼓励使用接口

这样可以实现功能和具体实现的分离

实现接口分离的原则

不是看实际需要用的

另外在提供一个datatable转list<>的代码:

public IList<T> GetList<T>(DataTable table)
{
IList<T> list = new List<T>(); //里氏替换原则
T t = default(T);
PropertyInfo[] propertypes = null;
string tempName = string.Empty;
foreach (DataRow row in table.Rows)
{
 t = Activator.CreateInstance<T>(); 创建指定类型的实例

propertypes = t.GetType().GetProperties(); //得到类的属性
foreach (PropertyInfo pro in propertypes)
{
tempName = pro.Name;
if (table.Columns.Contains(tempName.ToUpper()))
{
object value = row[tempName];
if (value is System.DBNull)
{
value = "";
}
pro.SetValue(t, value, null);
}
}
list.Add(t);
}
return list;
}

其中   T t = default(T); //就是返回T的默认值。比如说T的类型是int类型的,那么这个default(T)的值就是0的;如果是string类型的话,这个返回值就是“”空字符串的。

转载于:https://www.cnblogs.com/azzhang/p/4085142.html

泛型学习第一天:List与IList的区别 (二)相关推荐

  1. (转)ASP.NET MVC 学习第一天

    天道酬勤0322 博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅  | 管理 随笔:10 文章:0 评论:9 引用:0 ASP.NET MVC 学习第一天 今天开始第一天学习asp. ...

  2. Android学习第一书

    大家好,我是一名Facebook的工程师,同时也是<第一行代码--Android>的忠实读者. 虽然我最近几年是在国外读书和工作的,但是和很多人一样,我也非常喜欢郭霖的博客以及他写的< ...

  3. MongoDB学习第一篇 --- Mac下使用HomeBrew安装MongoDB

    2019独角兽企业重金招聘Python工程师标准>>> MongoDB学习第一篇 --- Mac下使用HomeBrew安装MongoDB 0.确保mac已经安装了HomeBrew ( ...

  4. jQuery框架学习第一天:开始认识jQuery

    jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...

  5. 201671010140. 2016-2017-2 《Java程序设计》java学习第一周

       java学习第一周        本周是新学期的开端,也是新的学习进程的开端,第一次接触java这门课程,首先书本的厚度就给我一种无形的压力,这注定了,这门课程不会是轻松的,同时一种全新的学习方 ...

  6. React  学习第一天-2018-07-21

    React  学习第一天 1.Dom 和虚拟Dom Dom 是浏览器中实际存在的,虚拟Dom是框架中的,是利用JS代码来模拟DOM. 虚拟Dom 是实现页面的实时更新. Dom树,一个网页的呈现过程, ...

  7. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.5 Adding a raster layer...

    MapServer Tutorial--MapServer7.2.1教程学习--第一节用例实践:Example1.5 Adding a  raster layer 一.前言 MapServer不仅支持 ...

  8. linux操作系统学什么,Linux学习-第一天-什么是操作系统

    Linux学习--第一天--什么是操作系统? 第一章 什么是Linux 1.1 什么是Linux 1.1.1 计算机:计算的辅助工具 计算机必须要有的组件: 输入单元:如鼠标.键盘.卡片阅读器机,等等 ...

  9. Python中的TCP的客户端UDP学习----第一篇博客

    Python中的TCP的客户端&UDP学习--第一篇博客 PS: 每日的怼人句子"我真想把我的脑子放到你的身体里,让你感受一下智慧的光芒" 先说UDP流程 发送: 创建套接 ...

  10. 4_1网络学习第一天后感--网络数据下载

    4_1网络学习第一天后感--网络数据下载 1.网络数据下载包括同步下载和异步下载,一般是使用异步下载,异步下载可以利用NSURLConnection这个类. 2.有关数据格式,有JSON格式(多数). ...

最新文章

  1. 完胜BERT!谷歌NLP预训练利器:小模型也有高精度,单个GPU就能训练 | 代码开源...
  2. NanoPi NEO Air使用四:操作GPIO
  3. Nano PC ubuntu13.10 源
  4. 机器学习的Agile过程
  5. centos部署mysql5.6免安装版
  6. 命令行方法查看和设置环境变量
  7. Vijos P1696 数与连分数【连分数】
  8. elementui 进度条怎么做_小E,Excel中这样的进度条是怎么做出来的?
  9. c语言统计数字字母个数,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
  10. Windows services相关命令
  11. C语言函数在硬件中的执行原理
  12. Web端打开文件选择和保存对话框
  13. 6.王道考研数据结构-栈
  14. Debugview调试视图
  15. Json工具 将对象转换为json格式字符串
  16. OpenCV 5种图像滤波辨析:方框、均值、高斯、中值、双边
  17. 使用H5Streamer轻松搭建视频监控项目
  18. Pyhton3 下载Telegram 频道数据
  19. 计算机公共基础知识总结,记住 | 公共基础知识备考之电脑常识总结!
  20. c语言接受mysql中文,C语言连接MySQL中文问题

热门文章

  1. 业余草教你简单 4 步搞定 SpringBoot 整合 Shiro!
  2. jQuery设置iframe的高度
  3. [源码剖析]tinyhttpd-C语言实现最简单的HTTP服务器
  4. 代码一致性 java_java实现一致性hash算法实例代码
  5. vmWare配置静态ip-net模式
  6. 安装linux-mysql-yum方式
  7. http请求转为https请求 java_如何将Javaweb工程的访问协议由http改为https及通过域名访问?...
  8. EasyUI:datagrid重置排序按钮状态
  9. mysql dba 试题_MySQLDBA面试题-上海热璞科技
  10. 使用JMH做Java微基准测试(一)测试入门