首页 > 代码库 > 解释泛型的基本原理
解释泛型的基本原理
分析问题
泛型的语法和概念非常类似于C++中的模版,泛型和C++中模版的设计是为了方便设计一些更加通用的类型,而在.NET中泛型还有另外一个重要作用,那就是避免容器操作中的装箱和拆箱动作。以下代码是一个简单的泛型例子:
using System;namespace Test{ class MainClass { static void Main() { //从开放类型到封闭类型 GenericClass<string> gc = new GenericClass<string>("我是泛型"); Console.WriteLine(gc); Console.Read(); } } class GenericClass<T> { T my; public GenericClass(T t) { my = t; } public override string ToString() { return my.ToString(); } }}
注意
所有的泛型参数名称都以T开头,这是由微软在产品文档中提出的建议,作为一种编码的通用规范,笔者建议读者严格遵守这样的规范,类似的规范还有所有的接口名称都以I开头。
在以上代码中,程序申明了一个泛型类型GenericClass<T>。不要被表面的负责所迷惑,和.NET的众多类型一样,带泛型参数的类型同样是一个确定的类型,在不被指定的情况下,它直接继承自System.Object类型,并且可以派生出其他类型。但是,泛型类型还是和普通类型有着一定的区别。通常泛型的类型被称为开放式类型,.NET的机制规定开放式类型不能被实例化,这样就确保了开放式类型的泛型参数类型在被指定之前,不会被实例化成任何对象(事实上.NET也没办法进行实例化,因为不确定需要分配多少内存给开放式类型)。在以上代码中的main方法中,指定了开放式类型的实参,这个时候重新定义了一个新的封闭式类型GenericClass<string>,针对该类型的所有实例化都是合法的。
为开放式的类型提供泛型的实例导致了一个新的封闭式类型的生成,但这并不代表新的封闭式类型和开放式类型有任何派生继承的关系,事实上,两者在类结构图上处于同一层次,并且两者之间没有什么关系。下图解释了这一概念。
在上图中,笔者构造了几个新的类型,别且用深、浅色区分了开放类型和闭合类型,读者可以清晰地看到,开放类型和闭合类型在类结构图中并没用任何区别,也没有相互间的联系。
最后读者需要了解的是,.NET在System.Collections.Generic命名空间下定义了诸如List<>、Dictionary<,>等泛型容器,并且在System.Array中定义了一些静态的泛型方法,读者应该在编写代码时充分利用已有的容器和算法,以提高开发和系统运行的效率。
说明
微软公司的产品文档上鼓励程序员使用新的泛型容器和方法来代替.NET1.1版本的容器和方法,以提高程序性能。
答案
泛型类似C++中的模版,允许程序员定义更通用的类型和算法,并且在具体使用时再生成具体的封闭类型。所有带泛型参数的类型都是一个开放式类型,它不能被实例化,但具备所有封闭类型的其他特性,本质上,它和封闭类型没有区别。