对值类型使用泛型集合类,在把引用类型时需要进行装箱和拆箱工作。
值类型存储在堆栈上,引用类型存储在堆上。C#类是引用类型,结构是值类型。.net很容易将值类型转换为应用类型,所以可以在需要对象(对象时引用类型)的任意地方使用值类型。例如,int可以赋予一个对象。从值类型转换为引用类型称为装箱。如果方法需要把一个对象作为参数,而且传送一个值类型,装箱操作就会自动进行。另一方面,装箱的值类型可以使用拆箱操作转换为值类型。在拆箱的时,需要使用类型转换运算符。
下面的例子显示了System.Collection 命名空间中的ArrayList类。ArrayList存储对象,Add()方法定义为需要把一个对象作为参数,所以需要装箱一个整数类型。在读取ArrayList中的值时,要进行拆箱,把对象转换为整数类型。可以使用可以使用类型转换符把ArrayList集合的第一个元素赋值变量il,在访问int类型的变量I2的foreach语句中也要使用类型转换运算符。
ArrayList list = new ArrayList();
list.Add(44); //boxing -convert a value type to a reference type
int il=(int)list[0];// unboxing - convert a reference type to a value type
foreach(int i2 in list) //ArrayList is a reference type
{
console.WriteLine(i2);
}
装箱和拆箱很容易实现,但是性能损失比较大,迭代许多项时尤其如此。
System.Collection.Generic命名空间中的List<T>类不需要使用对象,而是在使用时定义类型。
在下面的例子中,List<T>类的泛型定义为int,所以int类型在JIT编译动态生成的类中使用,不再进行装箱和拆箱操作。
List<int> list = new List<int>();
list.Add(44); //no boxing - value type are sorted in the Lisr<int>
int il = list[0]; //no boxing, no cast needed
foreach (int i2 in list)
{
Console.WriteLine(i2);
Console.ReadKey();
}
浙公网安备 33010602011771号