.NET泛型编程简介
.NET泛型编程已经离我们不远了,在微软最近随SQL Server Yukon Beta1发行的.NET Framework 1.2中就已经有了泛型的影子。虽然现在它还是问题多多,但是相信随着新版.NET Framework的正式发行(正式发行时的版本号会是2.0),这些问题会得到解决。因此我们也该为.NET泛型编程做些准备了。
.NET系统是一个单根继承系统,所有的类型都派生自Object。我以前一直认为在单根继承系统中用不着泛型。既然所有的东西都可以作为Object传递,又何必使用泛型呢?只是增加复杂度而已,除了看起来高深一点,似乎没有别的什么好处了。但是,当两个最著名的单根系统,Java和.NET,都势不可挡地要加入泛型编程时,我不免要重新审视这个问题——为什么一定要泛型编程?
归纳起来,泛型比非泛型具有下面两个优点:
1、更加安全
在非泛型编程中,虽然所有的东西都可以作为Object传递,但是在传递的过程中免不了要进行类型转换。而类型转换在运行时是不安全的。使用泛型编程将可以减少不必要的类型转换,从而提高安全性。
2、效率更高
在非泛型编程中,将简单类型作为Object传递时会引起Boxing和Unboxing操作,这两个过程都是具有很大开销的。使用泛型编程就不必进行Boxing和Unboxing操作了。
.NET泛型具有很好的二进制重用性。这一点得益于.NET将泛型内建在CLR之中。C++泛型和评估中Java泛型所依靠的是它们各自的编译器所提供的特性,编译器在编译泛型代码时将确切的类型展开,这就难免会出现代码膨胀的问题。而.NET的泛型代码是在运行时由JIT即时编译的,这样CLR就可以为不同类型重用大部分的即时编译代码了。
.NET 2.0的System.Collections.Generic 命名空间包含了泛型集合定义。各种不同的集合/容器类都被"参数化"了。为使用它们,只需简单地指定参数化的类型即可。
泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。
例子代码:
class Program { static void Main(string[] args) { int obj = 2; Test<int> test = new Test<int>(obj); Console.WriteLine("int:" + test.obj); string obj2 = "hello world"; Test<string> test1 = new Test<string>(obj2); Console.WriteLine("String:" + test1.obj); Console.Read(); } } class Test<T> { public T obj; public Test(T obj) { this.obj = obj; } } |
输出结果是:
int:2
String:hello world
程序分析:
1、 Test是一个泛型类。T是要实例化的范型类型。如果T被实例化为int型,那么成员变量obj就是int型的,如果T被实例化为string型,那么obj就是string类型的。
2、 根据不同的类型,上面的程序显示出不同的值。