C#基础总结——装箱与拆箱

           由于C#中所有数据类型都是基类System.Object继承而来,所以值类型引用类型的值可以通过显示(或隐式)操作相互转换,而这转换的过程也就是装箱(boxing)和拆箱(unboxing)的过程。

一、值类型:

         值类型是在栈中分配内存。值类型的数据值存储在内存的堆栈上,从内存的堆栈中可以快速访问这些数据值。

         值类型超出作用范围,系统自动释放内存。垃圾回收机制不参与回收。

         将一个值类型变量的内容赋值给另一个值类型的变量时,变量值被拷贝。

         主要由两类组成:结构和枚举,结构分为以下几类:

         

二、引用类型:

         引用类型在堆中分配内存,初始化时默认为null。在栈中保存指向堆中分配内存的地址,操作时通过栈中的指针寻找

         引用类型通过垃圾回收装置进行回收

         将一个引用类型变量的内容赋值给另一个引用类型的变量内容时,只是变量的内存地址被拷贝。

 三:拆箱和装箱

        装箱(boxing):装箱是把值类型转换成引用类型或到此值类型所实现的任何接口类型的隐式转换。

对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。

实例:

       int i=123;

       object o=i;

       可以看的出第一条语句创建一个变量i并将值放在托管栈上。第二条语句将i的值赋给引用类型,它将值引用类型放在托管堆中。这个值类型包装为引用类型的过程,称之为装箱。

                                                   C#基础总结——装箱与拆箱_第1张图片

        每次装箱时,都要在堆中new出一个新的对象,占用一定的内容,因此如果程序中频繁的进行装箱的操作的话,是会大大占用内存,影响程序的效率的。

        拆箱(unboxing):拆箱是把引用类型转换成值类型或从接口类型到实现该接口的值类型的显示转换

总结:在实际应用中应该尽量避免拆装箱的操作,因为频繁的拆装箱会大大影响程序的执行效率。

         int i=10;

         object obj=i;

         int j=(int)obj;

                                                       C#基础总结——装箱与拆箱_第2张图片

四、小结

       可以看出拆箱过程正好是装箱过程的逆过程。装箱和拆箱必须遵守类型兼容原则。装箱和拆箱使我们可以把一个值类型当作一个引用类型来看待装箱转换是指将 一个值类型隐式地转换成一个object 类型拆箱转换是指将一个object 类型显式地转换成一个值类型它们互为逆过程。


你可能感兴趣的:(C#基础总结——装箱与拆箱)