C#装箱和拆箱的原理

时间:2019-02-16
本文章向大家介绍C#装箱和拆箱的原理,主要包括C#装箱和拆箱的原理使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

提到装箱和拆箱,都知道值类型到引用类型是装箱,引用类型到值类型是拆箱。

那么现在看下面一个demo

class Program
{
   static void Main(String[] args)
   {
     int n=100;
     string s=Convert.ToString(n);
     int m=int.Parse(s);
     Console.ReadKey();
   }
}

上面这段程序看着是发生了装拆箱,其实并没有发生装拆箱。

int n=100;
object o=n;  //发生装箱
int m=(int) o;

下面这段代码就发生了装箱和拆箱。

原理:第二段代码int n=100,相当于在内存栈中分配一个空间,把100的值存进去。object o=n,就是在栈中先分配一个变量o,然后在堆里面在开辟一个空间,把100复制一份放到这个空间里面。然后让o指向了这个对象,这就发生了一次装箱。

 

拆箱就是在堆里面直接找到整形100他所存在的位置,把他拷贝一份拷贝到m里面这就是拆箱。

现在咱们来看看demo1的代码和demo2的代码有啥不一样:

string类型中是不可能放int类型的,不是把n的值直接拷贝到string类型中,而是在string类型中构造一个字符串。“100”,然后让s指向他。创建了一个全新的数据类型。所以这两种类型看起来差不多,其实不一样。装箱拆箱的前提条件就是具有父子类关系。

装箱就是把值类型直接拷贝到堆里面,拆箱就是直接从堆中找到这个值。