怎么学习泛型,看了半天还是晕
现在感觉泛型就是用一种大概的类型先在类里面写着,等实例的时候在给他赋上相应的类型,请大家深入浅出的帮我讲下,我看泛型包括很多什么方法,类,接口。。
------解决方案--------------------为什么不去MSDN上面看看呢,或者上网Google一下?
------解决方案--------------------在.NET Framework 2.0里引入了泛型的概念,使用泛型可以很有效地避免装/拆箱
http://blog.csdn.net/knight94/archive/2006/10/08/1326326.aspx
为了便于文章的开展,首先介绍装箱(Boxing)和拆箱(Unboxing)这两个名词。.Net的类型分为两种,一种是值类型,另一种是引用类型。这两个类型的本质区别,值类型数据是分配在栈中,而引用类型数据分配在堆上。那么如果要把一个值类型数据放到堆上,就需要装箱操作;反之,把一个放在堆上的值类型数据取出来,则需要进行拆箱操作。
例如,对于如下简单的装箱和拆箱操作语句。
int i = 123;
object obj = i;//Boxing
if( obj is int )
int j = (int) obj;//Unboxing
为了,更好的诠释装箱和拆箱操作,我借用MSDN关于“Boxing”的解释图,具体如下。
明白了这两名词的意思,现在说说为什么要减少装箱和拆箱操作。
原因有两个,主要是关于效率:一个就是对于堆的操作效率比较低;另一个就是对于堆上分配的内存资源,需要GC来回收,从而降低程序效率。
考虑到这两点因素,那么需要在程序中减少装箱和拆箱操作。
如何减少呢,涉及到这两个操作比较多的是,格式化输出操作,例如:String.Format,Console.WriteLine之类的语句。
例如:
Console.WriteLine( "Number list:{0}, {1}, {2} ",
1,2,3 );
对于“1,2,3”来说,相当于前面的“123”一样,需要经过装箱和拆箱两个操作。那么如何避免呢,其实只要向WriteLine传递引用类型数据即可,也就是按照如下的方式。
Console.WriteLine( "Number list:{0}, {1}, {2} ",
1.ToString(),2.ToString(),3.ToString() );
由于“1.ToString()”的结果是String类型,属于引用类型,因此不牵扯装箱和拆箱操作。
------解决方案--------------------主要就是 对于一个 类型的参数 可以在 编译时刻来决定
实际就是让你 使用同样一种处理 过程的 代码
可以 应对多种类型.
泛型最重要的一个优点就是不要求进行运行时类型检查。语言现有的类型检查是有限的,因为编译器只知道那么多。开发者如果因为错误的强制类型转换而遇到运行时异常,这个限制还会变得更加明显。相反,支持泛型的编译器将运行时类型检查提前到编译时执行,使代码更安全
泛型是为了优化代码,提高代码重用性,和业务逻辑没有必然联系
------解决方案--------------------呵呵...lz 我想向你学习...
------解决方案--------------------就是“类型未定”的时候使用~~~泛型好像很好理解吧???
这不是技术含量很高的知识点啊~~~
------解决方案--------------------其实就是c++中的模版而已
类模版
函数模版
可以在编码阶段能够确定的类型尽量用泛型 ,可以强制类型检查,减少运行时错误,提高运行效率
如:
ArrayList al = new ArrayList();
在al中可以放各种对象,但是当你在coding过程中明确知道我这个al对象中只可能放Person类的对象,
在1.1中只能al.Add(per);//per为Person对象
然后还要调用 al[0] as Person 或者(Person)al
但在2.0中可以
List <Person> list = new ....
这样就明确了类型,然后再操作中可以减少转换
其实这个不仅仅只是涉及到boxing ,unboxing
其实泛型的用处远远不止上述这么简单,自己摸索吧
------解决方案--------------------lz:其实可以用一个最简单的办法去理解:ArrayList与List <T> 的区别!
它们都是实现 IList 接口的类,具备IList约定的各种行为。
最大不同:前者在加入、获取元素时,不须指定具体类型,编译器必须执行相应的装箱和拆箱操作,会增加额外负担,从而会降低性能,尤其对大容量的集合,会更加明显!
而后者在定义和实例化时,就必须指定具体的类型,后来的操作会自动检查是否是此类型,否则报错!加入和获取元素的操场无限额外的装箱、拆箱操作,从而提高性能!
这点也是net为什么要提供泛型的重要原因。
至于其他,如与C++中的模版,有相似的地方,也有很大区别,lz可以看看MSDN,书上也有!
------解决方案--------------------关于我用的那个泛型,它的定义是这样的
public delegate void EventHandler <TEventArgs> (
Object sender,
TEventArgs e
) where TEventArgs : EventArgs
EventHandler 是个.net定义好的代理,是专门为事件处理准备的,所以我直接使用而没有自己定义一个delegate,泛型类似于C++的模板,起到的作用楼上的大侠们解释的已经很清楚了,使用的时候用尖括号里面的类型代替这个delegate的第二参数类型,而where TEventArgs : EventArgs要求类型必须从EventArgs中继承。
------解决方案--------------------泛型方法,就是说方法的构造函数的参数可以是类型
------解决方案--------------------学过C++么
相当于template
------解决方案--------------------3楼的兄弟解释的很清楚啊,这个主要是由于效率的问题才引进来的