泛型基础

首先要知道命名空间System.Collections.Generic其为大多数非泛型接口都定义了泛型版本。

了解其中几个泛型接口和核心类:

1.List<T>类

其主要可以动态调整内容。

2.Stack<T>类

表示以后进先出的方式维护数据的集合。包含Push()和Pop()方法。

3.Queue<T>类

表示以先进先出的方式访问数据的容器。包含Dequeue(),Enqueue(),Peek()方法。

4.SortedSet<T>类

.NET4中新引入的。这个类中的项是排序的,在插入和移除项之后,也能自动确保排序正确。不过,你必须通知

它按何种方式排序,可以向其构造函数传递一个实现了IComparer<T>泛型接口的参数。

 

 

最后要说明一下default关键字在泛型中的作用:

default(T):因为一个泛型类型预先并不知道实际的占位符,因此无法安全地假设默认值是什么。而这个语句就可以为其安全的给定默认值:

数值的默认值为0,引用类型的默认值为null,一个结构的字段被设为0(值类型)或null(引用类型)。

 

 

类型参数的约束:

可以使用where关键字对给定的类型参数添加一组约束(在泛型定义时)。

下面是几种泛型类型参数的约束:

where T : struct   该类型参数T必须在其继承链中包含System.ValueType值类型,即必须为结构

where T : class     T必须是引用类型

where T : new()     该类型参数必须包含一个默认的构造函数,如果有多个约束,则此约束必须列在末尾

where T : NameOfBaseClass     T必须派生于NameOfBaseClass指定的类

where T : NameOfInterface       T必须实现其指定的接口,多个接口用逗号隔开

注:此功能不常见

 

泛型有个最大的缺点:不能对类型参数T进行操作符!

当然,如果这里的T刚好是内置的数值数据,则可以使用C#的二进制操作符。但是,如果T是一个自定义类或结构,编译器就不能保证它已经重载了+,-,*和/。所以不能在创建泛型方法时,对类型参数应用任何C#操作符(加,减,乘,除等)。

posted @ 2012-05-07 21:15  rarry  阅读(366)  评论(0编辑  收藏  举报