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指向他。创建了一个全新的数据类型。所以这两种类型看起来差不多,其实不一样。装箱拆箱的前提条件就是具有父子类关系。

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

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值