关于Boxing和Unboxing

  要了解Boxing和Unboxing的原理,首先我们应该先说说引用类型和值类型,引用类型是总是在托管堆里分配的,C#的New操作符返回的就是对象位于托管堆中的内存地址,而值类型是”轻量级“类型,值实例通常分配在线程栈上(虽然他们也可以被嵌入到引用类型的对象中)。
      Boxing(装箱)是将一个值类型转化成引用类型的过程。值类型分配在托管堆中,不会执行垃圾收集,也没有指向他们的指针,但是很多情况,我们必须获得一个指向值类型实例的引用,例如,我们希望创建一个ArrayList对象保存一个Point结构,看起来如下:
Struct Point
{
   public int x,y;
}
class App
{
   ArrayList a=new ArrayList();
   Point p;
   for(int i=0;i<10;i++)
  {
    p.x=p.y=i;
    a.Add(p);
  }
}
  查看ArrayList的Add方法原形是 public virtual int Add(Object value),在这里加入的是一个引用类型   ,而我们的p是结构值类型,其实在运行的时候,CRL把结构p从线程栈中拷贝一份到托管堆,然后返回托管堆中新对象的地址。
     Unboxing(拆箱),将一个引用类型的实例从托管堆里拷贝一份到线程栈里,如
Point p=(Point)a[0];
    Boxing和Unboxing 不是严格意义上的互反操作,拆箱操作的代价要比装箱的代价小的多,拆箱操作只是获取对象中包含的值类型部分(数据字段)的指针而已,它不会想装箱子那样涉及任何内存的字节的拷贝,然而,紧接着拆箱之后典型的操作往往就是字段拷贝了,这两个操作和起来和装箱操作才是真正的互反操作。
   所以,无论是Boxing还是Unboxing,都会损失一定的性能,如果程序对性能的要求很高的话,应该尽量减少Boxing、Unboxing操作。 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值