对值类型使用泛型集合类,在把引用类型时需要进行装箱和拆箱工作。

值类型存储在堆栈上,引用类型存储在堆上。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();
            }

 

posted on 2012-02-16 09:36  为来的孩子  阅读(213)  评论(0)    收藏  举报