泛型学习第一天:List与IList的区别 (二)
原文:
探讨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的区别 (二)相关推荐
- (转)ASP.NET MVC 学习第一天
天道酬勤0322 博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅 | 管理 随笔:10 文章:0 评论:9 引用:0 ASP.NET MVC 学习第一天 今天开始第一天学习asp. ...
- Android学习第一书
大家好,我是一名Facebook的工程师,同时也是<第一行代码--Android>的忠实读者. 虽然我最近几年是在国外读书和工作的,但是和很多人一样,我也非常喜欢郭霖的博客以及他写的< ...
- MongoDB学习第一篇 --- Mac下使用HomeBrew安装MongoDB
2019独角兽企业重金招聘Python工程师标准>>> MongoDB学习第一篇 --- Mac下使用HomeBrew安装MongoDB 0.确保mac已经安装了HomeBrew ( ...
- jQuery框架学习第一天:开始认识jQuery
jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第一周
java学习第一周 本周是新学期的开端,也是新的学习进程的开端,第一次接触java这门课程,首先书本的厚度就给我一种无形的压力,这注定了,这门课程不会是轻松的,同时一种全新的学习方 ...
- React 学习第一天-2018-07-21
React 学习第一天 1.Dom 和虚拟Dom Dom 是浏览器中实际存在的,虚拟Dom是框架中的,是利用JS代码来模拟DOM. 虚拟Dom 是实现页面的实时更新. Dom树,一个网页的呈现过程, ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.5 Adding a raster layer...
MapServer Tutorial--MapServer7.2.1教程学习--第一节用例实践:Example1.5 Adding a raster layer 一.前言 MapServer不仅支持 ...
- linux操作系统学什么,Linux学习-第一天-什么是操作系统
Linux学习--第一天--什么是操作系统? 第一章 什么是Linux 1.1 什么是Linux 1.1.1 计算机:计算的辅助工具 计算机必须要有的组件: 输入单元:如鼠标.键盘.卡片阅读器机,等等 ...
- Python中的TCP的客户端UDP学习----第一篇博客
Python中的TCP的客户端&UDP学习--第一篇博客 PS: 每日的怼人句子"我真想把我的脑子放到你的身体里,让你感受一下智慧的光芒" 先说UDP流程 发送: 创建套接 ...
- 4_1网络学习第一天后感--网络数据下载
4_1网络学习第一天后感--网络数据下载 1.网络数据下载包括同步下载和异步下载,一般是使用异步下载,异步下载可以利用NSURLConnection这个类. 2.有关数据格式,有JSON格式(多数). ...
最新文章
- 完胜BERT!谷歌NLP预训练利器:小模型也有高精度,单个GPU就能训练 | 代码开源...
- NanoPi NEO Air使用四:操作GPIO
- Nano PC ubuntu13.10 源
- 机器学习的Agile过程
- centos部署mysql5.6免安装版
- 命令行方法查看和设置环境变量
- Vijos P1696 数与连分数【连分数】
- elementui 进度条怎么做_小E,Excel中这样的进度条是怎么做出来的?
- c语言统计数字字母个数,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
- Windows services相关命令
- C语言函数在硬件中的执行原理
- Web端打开文件选择和保存对话框
- 6.王道考研数据结构-栈
- Debugview调试视图
- Json工具 将对象转换为json格式字符串
- OpenCV 5种图像滤波辨析:方框、均值、高斯、中值、双边
- 使用H5Streamer轻松搭建视频监控项目
- Pyhton3 下载Telegram 频道数据
- 计算机公共基础知识总结,记住 | 公共基础知识备考之电脑常识总结!
- c语言接受mysql中文,C语言连接MySQL中文问题
热门文章
- 业余草教你简单 4 步搞定 SpringBoot 整合 Shiro!
- jQuery设置iframe的高度
- [源码剖析]tinyhttpd-C语言实现最简单的HTTP服务器
- 代码一致性 java_java实现一致性hash算法实例代码
- vmWare配置静态ip-net模式
- 安装linux-mysql-yum方式
- http请求转为https请求 java_如何将Javaweb工程的访问协议由http改为https及通过域名访问?...
- EasyUI:datagrid重置排序按钮状态
- mysql dba 试题_MySQLDBA面试题-上海热璞科技
- 使用JMH做Java微基准测试(一)测试入门