X龙@China .Net 'blog

需要的不仅仅是工作,而是通过努力得来的美好将来。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

c#装箱与拆箱

Posted on 2009-10-22 23:52  X龙  阅读(220)  评论(0编辑  收藏  举报

  通常装箱和拆箱都有较大的性能损害,相比之下,装箱损害会更大,主要表现在需要的内存和产生的代码大小和所做的工作量等方面

  •   装箱是将值类型转换为引用类型的过程,装箱通常由以下几步完成:

  1.按值类型对象所需的内存空间和额外成员(一个指向方法表的指针和一个SyncBlockIndex)在托管堆中分配内存空间。

  2.将值类型实例的字段拷贝到托管堆新分配对象的内存空间中。

  3.返回新对象托管堆中的引用(指针)。值类型实例由此变成了引用类型。

  •   拆箱将已装箱的引用类型转换成值类型。严格来讲,拆箱并不是装箱的逆向过程。其过程为:

  1.先找到已装箱的引用类型中的值类型字段的指针。这也就是拆箱过程所做的工作,仅仅获取对象中指向值类型的指针。

之后,紧接着将对象中值类型的字段拷贝到目标值类型中。

这两个过程加起来才是装箱的反向过程。

 

一般出现装箱的情况:

  》将值类型赋值给引用类型

  》调用值类型基类中实现而在当前类又没有重写的方法。对这种情况解释一下,当调用基类中的方法时,需要一个指向基类的方法表的指针,而这个指针只有引用类型才胡,值类型是没有的,所以需要装箱。

 

 

点击这里给我发消息http://wp.qq.com/index.html