轻松学习C#的装箱与拆箱

2019-12-30 11:18:35王冬梅
轻松学习C#的装箱与拆箱,在之前的文章简单的提到了轻松学习C#的装箱与拆箱,本文带着大家更加详细的介绍轻松学习C#的装箱与拆箱,感兴趣的小伙伴们可以参考一下  

首先看一看什么是装箱和拆箱?
       简单的来说:
       装箱就是值类型转换为引用类型;
       拆箱就是引用类型转换为值类型。
       值类型,包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举 (enum) 、结构 (struct)。
       引用类型包括类、数组、接口、委托、字符串等。

装箱:值类型到引用类型或到此值类型所实现的任何接口类型的隐式转换
       例如: int temp = 3;
                System.Object obj = temp;
       其中,temp为值类型,在栈中分配;当分配obj这个引用类型时,我们需要在堆中分配一个obj对象,然后把temp值赋给它,这么一系列的过程就是装箱的过程。

拆箱:从引用类型到任意值类型的显式转换。与装箱不同,拆箱式显示转换。
       例如:int temp = 3;
                 System.Object obj = temp;
                  int i = (int) obj;
       拆箱过程中,首先来确定对象obj为一个值类型的装箱值,然后把值赋给值类型。
隐式转换总会成功的情况,不会抛出异常:
  (1)、从派生类到基类;
  (2)、从派生接口到基接口;
  (3)、从类到接口(该类实现了接口);
  (4)、从Null到任何类;
显式引用转换,以下可能抛出异常,转换不一定成功:
  (1)、从基类到派生类;
  (2)、从接口到接口(基接口到派生接口或者俩接口没有关系);
  (3)、从接口到类(该类实现了该接口或该类未封闭);
  (4)、从类到接口(该类未实现该接口且该类未封闭);

上面简单的介绍了拆箱和装箱的定义,下面就来讨论一下装箱和拆箱与堆和栈怎样使用
       其中值类型是在栈中分配内存,本身的声明就是一个初始化的过程,其不需要进行垃圾回收,只要超出所定义的作用范围会自动释放内存,而引用类型则是在堆中分配的,和java一样,在堆种分配内存,而其托管堆进行垃圾回收。当两种数据类型进行转换时就引出了装箱/拆箱。