A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林成彬 高级黑马   /  2013-12-18 19:51  /  1072 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 林成彬 于 2013-12-18 20:25 编辑

最近在学习中经常用到泛型集合List<>,求指导泛型与反射之间有什么关系?

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

4 个回复

倒序浏览
其实不应该说是两者的区别的,他们是一个包含的关系!

在面向对象编程中有一个术语,叫泛化,而这个泛型的来源正是来源于这里!所谓的泛型就是指的存储的是其父类型,而实现使用时声明好子类型而已。

不管是在java还是C#中,所有的类型都是基于object这个基础类型的。可以认为所有的其他类型都是object的泛型。

而泛型集合指的就是将这些泛型放在一起的集合,但在使用前必须选进类型加以加说明。

如List<T>就是一个泛型集合,可以将所有的泛合放在该集合中来。但前提时必须选声明T的类型,否则不能进行放入。这个涉及到了存储的问题,当初如果我们对于一些集合来说,比如我们可以声明这样的数组int[] a = new int[10];一旦声明,其大小不可改变,如果事选我们不知道要存入多少个,假定在存10个int,你用int[] a = new int[10];当然没有人反对,但问题是随着程序的运行我们可以要我不至10个,而这个数组却无法对其进行加长;或者你可能会说,管他呢int[] a = new int[1000];肯定够用,但那样又有诸多的内在空间在浪费!所以我们考虑到了另一个类型array这个很不错的,但是由于array在放入到必须进行打包,取出时拆包,极大的浪费了cpu的利用。

那么在.net framework2.0中添加了关于泛型的支持,也就是实现了IList接口,他既有array的特性又具有长度可以增大添小的特点,还是还是避免了打包问题,这也是在.net 2.0之后微软说,没有事后话大家都用arraylist等支持泛型的原因!

事实上由于长期的习惯,泛型我们指的就是实现IList接口的数组之类的集合类型,所以我们在称泛型或是泛型集是时,实际上是同一概念!

评分

参与人数 1技术分 +1 收起 理由
V_John + 1 很给力!

查看全部评分

回复 使用道具 举报
1. 反射提供了描述程序集、模块和类型的对象(Type 类型);
2. 可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性;
3. 因为公共语言运行库 (CLR) 能够在运行时访问泛型类型信息,所以可以使用反射获取关于泛型类型的信息,方法与用于非泛型类型的方法相同;
4. 非泛型类(换句话说,即具体类)可以从封闭式构造基类继承,但无法从开放式构造类或裸类型形参继承,因为在运行时客户端代码无法提供实例化基类所需的类型实参。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
非常感觉各位的回答。
回复 使用道具 举报
因为公共语言运行时 (CLR) 能够在运行时访问泛型类型信息,所以可以使用反射获取关于泛型类型的信息,方法与用于非泛型类型的方法相同。使用值类型或引用类型参数实例化泛型 C# 类时,反射可以在运行时查询它,并且可以确定它的实际类型及其类型参数。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马