泛型基础
首先要知道命名空间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#操作符(加,减,乘,除等)。