1 概述:

自从.Net 2.0 发布以来,.Net就开始支持泛型,泛型不仅仅是C#语言的一部分,它和微软中间语言(IL)一起紧密集成在程序集中,使用泛型,你可以创建独立于内置类型的类和方法,可以只创建一个类或者方法来替代许多功能相同,但是类型不同的类和方法。(有点绕)

泛型被定义在CLR中,而不仅仅是C#中,所以在C#中定义的类,可以用VB中的特定类型来实例化。(翻译的不知道准确不)

2 泛型的优点:

(1)       性能(Performance: 

     泛型的最大优势就是性能,在使用集合类时,非泛型的集合类涉及到值类型与引用类型的相互转换的时候,会导致装箱与拆箱的发生。下面以ArrayList为例简要说明:

Var  list=new ArrayList();

list.add(12);//自动装箱,因为Add()方法需要Object类型参数

int i=(int) list[0];//拆箱  转换成值类型

foreach(int i  in list)

{

 Console.WriteLine(i);  //拆箱

}

   装箱和拆箱对应用程序性能会有很大影响,特别是在集合中有很多个元素需要迭代的时候。而使用泛型的List<T>,指定T的类型后,就不会发生装箱与拆箱。

(2)       类型安全(Type  Safety):

     泛型的另一个特点就是类型安全的,以上面的ArrayList为例,任何对象都有可能被添加进集合中,比如:list.add(13),list.add(“Hello”),编译器不会报错,但当使用下面的foreach迭代时,由于list.add(“Hello”),添加的元素不能被转换成int类型,将会产生运行时异常。

foreach(int i  in list)

{

 Console.WriteLine(i); 

}

而使用List<T>,T 可以明确指定集合中允许添加的类型,这样可以保证添加进集合中元素的合法性。

(3)       二进制代码的复用(Binary Code Reuse):

泛型类能够被定义一次,而实例化多次。

3 泛型的特点:

  1)不能将null赋值给泛型。因为泛型可以被实例化为值类型,而null只能应用在引用类型上。解决方法是使用default关键字,default(T) 默认将值类型初始化为0,引用类型初始化为null

  2) 泛型的约束:

Where T : struct

struct约束,T必须是值类型的

Where T: class

class约束,T必须是引用类型的

Where TIFoo

T必须实现接口IFoo

Where T: Foo

T必须继承自基类Foo

Where T: new()

构造器约束,T必须有一个默认的构造器

Where T1: T2

T1必须继承泛型T2

注:1.构造器约束:只能为默认构造器定义约束,而不能为其他构造器定义约束。

    2.可以为泛型同时定义多个约束,用逗号分隔。

4 Covariance and Contra-variance

5 泛型结构Nullable<T>

1)定义可空类型 Nullable<int> x1int ? x2两种方式;

2)可空类型可用于算术运算,可以将非可空类型转换成可空类型。

  Int x=3; int ? y=x; 

3) 可空类型转换成非可空类型,必须显示转换。

Int ? x=…; int y=(int)x; 或者使用“??”来进行转换,int y1=x ?? 0 ; 这里如果xnull,y1的值为0

6 泛型方法:

      1)泛型方法可以带有泛型约束。

      2)泛型方法中代理的使用。

 

posted on 2011-01-20 12:49  Kv2019  阅读(224)  评论(0编辑  收藏  举报