您的位置:首页 > 编程语言 > C#

C# 泛型(学习笔记)

2011-01-20 12:49 387 查看
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 T:IFoo

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> x1和int ? x2两种方式;

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

Int x=3; int ? y=x;

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

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

6 泛型方法:

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

2)泛型方法中代理的使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: