在 ArrayList等集合类中,元素的类型均为 Object。由于.NET 中所有类都继承于 Object,所以这些集合可以存储任何类型的元素。
例如:
ArrayList list = new ArrayList();
list.Add(10); //添加元素
int n = (int)list[0]; //读取元素
在添加元素的过程中,整数 10 被装箱成 Object 对象,然后添加到数组列表中。元素从数组列表读取出来后类型为 Object,必须通过拆箱操作转换为 int 型,才能赋给 int 型变量 n。
缺点:
在装箱、拆箱的过程中,可能会造成一定的性能损失
不利于编译器进行严格的类型安全检查
显式转换会降低程序的可读性
1)泛型方法
例如,交换两个数,可以使用方法的重载,来实现两个整数、两个float和两个double的交换。也可以使用泛型方法:
static void Swap<T>(ref T a,ref T b){
T t=a;
a=b;
b=t;
}
static void Main(string[] args)
{
...
Swap<int>(ref a, ref b);
}
2)泛型类
class A<T>{
public void Swap(ref T a,ref T b){
T t=a;
a=b;
b=t;
}
}
static void Main(string[] args)
{
int a=6,b=5;
A<int> aa=new A<int>();
aa.Swap(ref a,ref b);
System.Console.WriteLine("a={0},b={1}",a,b);
}
泛型的定义中可含有多个类型参数。
class Dictionary<K, V>{
}
对应的,在使用泛型类 Dictionary<K, V>时,必须提供两个类型实参。
Dictionary<int, string> dic = new Dictionary<int, string>();
泛型最常见的用途是定义泛型集合,泛型集合和相对应的非泛型集合功能基本相同,但泛型集合能提供严格的类型检查,具有较强的安全性。此外,如果元素类型为值类型,泛型集合的性能通常优于非泛型集合。泛型集合类定义在 System.Collections.Generic 命名空间中。