泛型不是一开始就提出的,而是在实践中一步一步完善的。那么什么是泛型?
Ø 泛型
泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数 T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险。
泛型:具有占位符的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。
泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。
泛型集合类是对于数组和ArrayList集合的一个进一步的改进,成为集其两者优点为一体的好东西。讲解一下泛型的出现及好处。我们以设计模式上的一个例子来讲解。
就其中动物报名事件来说:
u 以数组形式
public partial class Form1 : Form //实例化的窗体,数组也是与窗体上的构件同级别的
{
private void button3_Click(object sender, EventArgs e) //动物报名事件
{
arrayAnimal = new Animal[5];
arrayAnimal[0] = new Cat("小花");
arrayAnimal[1] = new Dog("阿毛");
arrayAnimal[2] = new Dog("小黑");
arrayAnimal[3] = new Dog("娇娇");
arrayAnimal[1] = new Dog("咪咪");
}
}
u 以ArrayList集合形式
首先需要增加一个命名空间:usingSystem.Collections
using System.Collections;
public partial class Form1 : Form //实例化的窗体,数组也是与窗体上的构件同级别的
{
ArrayList arrayAnimal; //声明一个集合变量
private void button3_Click(object sender, EventArgs e) //动物报名事件
{
arrayAnimal = new ArrayList(); //此时并没有指定arrayAnimal的大小。实例化了ArrayList对象
arrayAnimal.Add(new Cat("小花"));
arrayAnimal.Add(new Dog("阿毛"));
arrayAnimal.Add(new Dog("小黑"));
arrayAnimal.Add(new Cat("娇娇"));
arrayAnimal.Add(new Cat("咪咪")); MessageBox.Show(arrayAnimal.Count.ToString()); //随着Add对象的增加,集合的Count可以得到当前的元素个数
}
}
u 泛型集合
首先要增加一个命名空间:using System.Collections.Generic
using System.Collections.Generic;
public partial class Form1 : Form //实例化的窗体,数组也是与窗体上的构件同级别的
{
IList<Animal> arrayAnimal; //声明一个泛型集合变量
private void button3_Click(object sender, EventArgs e) //动物报名事件
{
arrayAnimal = new List <Animal >(); //实例化List对象
arrayAnimal.Add(new Cat("小花"));
arrayAnimal.Add(new Dog("阿毛"));
arrayAnimal.Add(new Dog("小黑"));
arrayAnimal.Add(new Cat("娇娇"));
arrayAnimal.Add(new Cat("咪咪")); MessageBox.Show(arrayAnimal.Count.ToString()); //随着Add对象的增加,集合的Count可以得到当前的元素个数
}
}
这是这三种方式定义出同一事件表示形式,看似没有不太一样的地方,但是其表现确实各不相同。
u 泛型集合VS ArrayList集合VS Array数组
数组:
优点:数组在内存中连续存储,使得能够快速实现从头到尾的遍历。
可以快速修改元素。
缺点:创建时必须指定数组变量的大小。
在两个元素之间添加元素也比较困难。
集合:
优点:使用大小可以按需动态增加,其容量是ArrayList可以保存的元素数。
容量可以根据需要自动扩充。
使用整数索引可以访问此集合中的元素。
缺点:ArrayList的类型不是安全的,我们可以添加
arrayAnimal.Add(new Cat("123"));
arrayAnimal.Add(new Cat("hello World"));
在编译时不会报错,但是在执行时,也就是:
foreach (Animal item in arrayAnimal)
{
MessageBox.Show(item.Shout());
}
因为需要确定集合中的元素是Animal的,所以123的整型和字符串的Hello World均会报错。
此外还有就是会设计到拆箱和装箱的操作(见下一篇博客),拆箱装箱意味着要进行大量的计算,会消耗资源和时间,所以集合在存放值类型数据时,便会进行装箱和拆箱操作,可见要耗费很多的时间和资源。
泛型集合:
优点:弥补或者填补了ArrayList集合的不足,通常下使用泛型集合。
获得的类型是安全的,并且不需要从基集合类型派生并实现类型特定的成员。
集合元素为值类型时,泛型集合类型的性能优于非泛型集合类型,即使用泛型不必对元素进行装箱。