首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

如何学习泛型,看了半天还是晕

2012-01-08 
怎么学习泛型,看了半天还是晕现在感觉泛型就是用一种大概的类型先在类里面写着,等实例的时候在给他赋上相

怎么学习泛型,看了半天还是晕
现在感觉泛型就是用一种大概的类型先在类里面写着,等实例的时候在给他赋上相应的类型,请大家深入浅出的帮我讲下,我看泛型包括很多什么方法,类,接口。。

[解决办法]
为什么不去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楼的兄弟解释的很清楚啊,这个主要是由于效率的问题才引进来的


[解决办法]
反省有他的优势也有不好的地方。

泛型主要分为泛型类型和泛型方法。泛型类、泛型结构、泛型委托和泛型接口都属于泛型类型。
泛型类型的不便之处在于每一个不同类型参数的泛型类型都被当成不同的类型,例如我们可以用一个非泛型方法处理里面装了任何类型元素的ArrayList,却不能用同样的方法处理泛型List。

当然,泛型方法可以帮助我们解决这个问题,这是泛型方法的使用场景之一,处理泛型类型。

一般说来,泛型类的主要用途在于作为不同类型的处理器,例如强类型分页器。当一个类型中的两个方法参数或返回值类型需要保持某种一致时,泛型类是合适的选择。

泛型结构大体上与泛型类差不多。

泛型接口一般作为泛型类的抽象而应用,例如IList <T> 。

泛型委托的使用场景很复杂,一般来说,泛型委托与泛型一样,是为了处理泛型类型。所以,泛型委托一般不能脱离泛型方法、泛型类型使用。

例如,将一个类型的数组转换为另一个类型的数组的泛型方法可以这样写:
public TTarget[] ConvertArray < TSource, TTarget > ( TSource[] array, TypeConverter <TSource, TTarget> converter )

泛型委托:
delegate TT TypeConverter <TS, TT> ( TS value )
[解决办法]
泛型只是对不同类型数据的 相同行为 的处理方式
[解决办法]
先看看模板吧
[解决办法]
更正:
泛型委托的使用场景很复杂,一般来说,泛型委托与泛型方法一样,是为了处理泛型类型。所以,泛型委托一般不能脱离泛型方法、泛型类型使用。

抬头的反省是泛型。
[解决办法]
一般把泛型看作文本替换好了,最大好处是减少重复代码。
[解决办法]
一般把泛型看作文本替换好了,最大好处是减少重复代码。
---------------------
C++实现可以当作替换 C#却不是 否则也就不能利用反射看到泛型了 而会是一个个具体的类
泛型说到底就是复用算法 不用Boxing类型安全等只是它带来的好处而不是目的
[解决办法]
实际上范型如果你明白了很简单,就是在以前的.Net 1.1 里,所有的集合类,如ArrayList和HashTable,这些集合类为了适合放东西,都被设计成了放进里头的类实例都是Object类型的。

使用的时候,类实例放进去的时候如果是值类型还要装箱;从集合里获取类型的时候要做类型转换,非常麻烦。

范型的作用就是你使用集合和函数参数这些实用类型信息的时候可以使用动态类型。也就是说,范型是类型的变量。

定义一个变量,表示这个变量里头的数据是不定的,你不知道这个变量在运行的时候的内容是什么,如:
int i;
你根本不知道这个变量i的数字值是多少,除非你使用调试功能或显示。但是可以确定的是i这个变量是Int32类型的,因为前面有个int 的定义。

而范型表示前面的int类型定义也是变量,如:
T i;
这时,你即不知道i变量是什么内容,你也不知道是什么类型。

所以,如果集合用上范型,就不用使用麻烦的装箱和类型转换操作,这大大减少了错误。

如以前的ArrayList:
ArrayList list = new ArrayList();
list.Add(new DataTable();
这时,这个ArrayList里有一个DataTable实例,但是无法直接获取,必须使用类型转换,因为ArrayList里的东西都是以object形式存放的。
DataTable t = (DataTable)list[0];

而范型集合对象ArrayList的就是List <T> ,我们使用它就可以直接设定使用DataTable
List <DataTable> list = new List <DataTable> ();
list.Add(new DataTable);
DataTable t = list[0];
[解决办法]
看C++PRIMEER啊 那可是将的很详细啊

热点排行