装箱和取消装箱详解

装箱:

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

如: int i = 123; object o = i;

此语句的结果是在堆栈上创建对象引用 o,而在堆上则引用 int 类型的值。 该值是赋给变量 i 的值类型值的一个副本 

下图说明了两个变量 i 和 o 之间的差异。

BoxingConversion 图

也可以进行显式装箱,但显式装箱不是必需的:

如:i = 123; object o = (object)i;

取消装箱

取消装箱是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换

 取消装箱操作包括:

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

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

如:i = 123; object o = i;  int j = (int)o;

下图演示上述语句的结果。

图:取消装箱转换

取消装箱转换

注意:

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

性能问题:

相对于简单的赋值而言,装箱和取消装箱过程需要进行大量的计算。 对值类型进行装箱时,必须分配并构造一个新对象。 取消装箱所需的强制转换也需要进行大量的计算,只是程度较轻。

参考自:



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值