0%

泛型的特点

泛型的主要特性

泛型类型的一些重要特征使它们相比传统的非泛型类型具有如下的显著特征:

类型安全
性能
二进制代码复用

类型安全

泛型最重要的特征之一是类型安全性。对于非泛型ArrayList类,如果使用对象类型,则可以向集合中添加任何类型,这些类型有时会导致严重的问题。下面的示例显示向ArrayList类型的集合添加一个整数、字符串和对象;

1
2
3
4
ArrayList obj = new ArrayList();  
obj.Add(50);
obj.Add("Dog");
obj.Add(new TestClass());

现在,如果使用整数对象来使用foreach语句进行遍历的话,当编译器接受到代码,但是因为集合中的所有元素都不是整数,所以会导致运行时异常;

1
2
3
4
foreach(int i in obj)  
{
Console.WriteLine(i);
}

编程的经验法则是应该尽早检测到错误。对于泛型类Test,泛型类型T定义允许哪些类型。通过使用Test的定义,只能向集合添加整型类型的数据。这时候当Add()方法具有以下无效参数的时候编译器将不编译代码;

1
2
3
4
Test<int> obj = new Test<int>();  
obj.Add(50);
obj.Add("Dog"); //编译错误
obj.Add(new TestClass()); //编译错误
性能

在下面的示例中,ArrayList类存储对象,并且定义了Add()方法来存储一些整型参数。因此,整数类型被装箱。当使用foreach语句读取ArrayList中的值时,将发生拆箱。

1
2
3
4
5
6
7
ArrayList  obj = new ArrayList();   
obj.Add(50); //装箱- 值类型转换成引用类型
int x= (int)obj[0]; //拆箱
foreach(int i in obj)
{
Console.WriteLine(i); // 拆箱
}

注意:泛型比其他集合(如ArrayList)更快。

代替使用对象类型,TestClass类的泛型类型被定义为int,因此在从编译器动态生成的类中将使用int类型。所以将不会发生装箱和拆箱,如下所示;

1
2
3
4
5
6
7
TestClass<int> obj = new TestClass<int>();  
obj.Add(50); //没有装箱
int x= obj[0]; // 没有拆箱
foreach(int i in obj)
{
Console.WriteLine(i); //没有拆箱
}
二进制代码复用

泛型类型提供了一种源代码保护机制。泛型类可以定义一次,并且可以使用许多不同类型来进行实例化。泛型可以在一种CLR支持的语言中定义,并可以被另一种.NET语言使用。以下TestClass 使用int和string类型进行实例化:

1
2
3
4
5
TestClass<int> obj = new TestClass<int>();  
obj.Add(50);

TestClass<string> obj1 = new TestClass<string>();
Obj1.Add("hello");