首页 > 代码库 > 解释泛型的基本原理

解释泛型的基本原理

分析问题

  泛型的语法和概念非常类似于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++中的模版,允许程序员定义更通用的类型和算法,并且在具体使用时再生成具体的封闭类型。所有带泛型参数的类型都是一个开放式类型,它不能被实例化,但具备所有封闭类型的其他特性,本质上,它和封闭类型没有区别。