C#笔记10:泛型
时间:2010-09-11 来源:luminji
C#笔记10:泛型
本章概要:
1:泛型的优点
2:泛型参数的命名规则
3:泛型参数的约束
1:泛型的优点
泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。建议面向 .NET Framework 2.0 及更高版本的所有应用程序都使用新的泛型集合类,而不要使用旧的非泛型集合类如 ArrayList。通过创建泛型类,您可以创建一个在编译时类型安全的集合。
为什么这么说呢,我们来看下面的例子:
添加到 ArrayList 中的任何引用或值类型都将隐式地向上强制转换为 Object。 如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。 强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。
另一个限制是缺少编译时类型检查;因为 ArrayList 会将所有项都强制转换为 Object,所以在编译时无法防止客户端代码执行类似如下的操作:
尽管将字符串和 int 组合在一个 ArrayList 中的做法在创建异类集合时是完全可接受的,并且有时需要有意为之,但这种做法很可能产生编程错误,并且直到运行时才能检测到此错误。
2:泛型参数的命名规则
务必使用描述性名称命名泛型类型参数,除非单个字母名称完全可以让人了解它表示的含义,而描述性名称不会有更多的意义。
考虑使用 T 作为具有单个字母类型参数的类型的类型参数名。
务必将“T”作为描述性类型参数名的前缀。
考虑在参数名中指示对此类型参数的约束。 例如,可以将带有 ISession 约束的参数命名为 TSession。
3:泛型参数的约束
T:结构
类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。有关更多信息,请参见使用可以为 null 的类型(C# 编程指南)。
T:类
类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
T:new()
类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
T:<基类名>
类型参数必须是指定的基类或派生自指定的基类。
T:<接口名称>
类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
T:U
为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。
可以对同一类型参数应用多个约束,并且约束自身可以是泛型类型,如下所示: