前言
.net 2.0中泛型的出现是一个令人激动的特征。但是,什么是泛型?你需要它们吗?你会在自己的应用软件中使用它们?在本文中,我们将回答这些问题并细致地分析泛型的使用,能力及其局限性。
类型安全
.net中的许多语言如c#,c++和vb.net(选项strict为on)都是强类型语言。作为一个程序员,当你使用这些语言时,总会期望编译器进行类型安全的检查。例如,如果你把对一个book类型的引用转换成一个vehicle型的引用,编译器将告诉你这样的cast是无效的。
然而,当谈到.net 1.0和1.1中的集合时,它们是无助于类型安全的。请考虑一个arraylist的例子,它拥有一个对象集合--这允许你把任何类型的对象放于该arraylist中。让我们看一下例1中的代码。
例1.缺乏类型安全的arraylist
using system;
using system.collections;
namespace testapp
{
class test
{
[stathread]
static void main(string[] args)
{
arraylist list = new arraylist();
list.add(3);
list.add(4);
//list.add(5.0);
int total = 0;
foreach(int val in list)
{
total = total + val;
}
console.writeline("total is {0}", total);
}
}
}
本例中,我们建立了一个arraylist的实例,并把3和4添加给它。然后我循环遍历该arraylist,从中取出整型值然后把它们相加。这个程序将产生结果"total is 7"。现在,如果我注释掉下面这句:
list.add(5.0);
程序将产生如下的运行时刻异常:
unhandled exception: system.invalidcastexception: specified cast is not valid.
attestapp.test.main(string[]args)in :workareatestappclass1.cs:line 17
哪里出错了呢?记住arraylist拥有一个集合的对象。当你把3加到arraylist上时,你已把值3装箱了。当你循环该列表时,你是把元素拆箱成int型。然而,当你添加值5.0时,你在装箱一个double型值。在第17行,那个double值被拆箱成一个int型。这就是失败的原因。
注意:上面的实例,如果是用vb.net书写的话,是不会失败的。原因在于,vb.net不使用装箱机制,它激活一个把该double转换成整型的方法。但是,如果arraylist中的值是不能转换成整型的,vb.net代码还会失败。
作为一个习惯于使用语言提供的类型安全的程序员,你希望这样的问题在编译期间浮出水面,而不是在运行时刻。这正是泛型产生的原因。
3. 什么是泛型?
泛型允许你在编译时间实现类型安全。它们允许你创建一个数据结构而不限于一特定的数据类型。然而,当使用该数据结构时,编译器保证它使用的类型与类型安全是相一致的。泛型提供了类型安全,但是没有造成任何性能损失和代码臃肿。在这方面,它们很类似于c++中的模板,不过它们在实现上是很不同的。
首页 1 2 3 4 5 6 7 8 9 末页