基础:C#装箱拆箱的计算

装箱和拆箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个新对象。次之,拆箱所需的强制转换也需要进行大量的计算.

 装箱

装箱用于在垃圾回收堆中存储值类型。装箱是值类型object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。

 int i = 123;

object o = i;

在堆栈上创建对象引用 o,而在堆上则引用 int 类型的值。该值是赋给变量 i 的值类型值的一个副本。下图说明了两个变量 io 之间的差异。

 
 

所以此时改变i的值,o的值是不会变的。因为原始值类型和装箱的对象使用不同的内存位置。

 

拆箱

拆箱操作包括:

  • 检查对象实例,以确保它是给定值类型的装箱值。

  • 将该值从实例复制到值类型变量中。

  •  

int i = 123;      // a value type
object o = i;     // boxing
int j = (int)o;  // unboxing

要在运行时成功取消装箱值类型,被取消装箱的项必须是对一个对象的引用,该对象是先前通过装箱该值类型的实例创建的。
尝试取消装箱 null 或对不兼容值类型的引用会导致 InvalidCastException

 

 

 

posted @ 2010-07-30 16:25 harry.guo 阅读(...) 评论(...) 编辑 收藏