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