c#装箱与拆箱(Boxing&Unboxing)

本文详细介绍了C#中的装箱和拆箱概念。装箱是将值类型转换为引用类型,在堆上分配内存并复制字段,而拆箱则是从引用类型获取值类型字段的地址。装箱需要显示执行,拆箱可以隐式执行,但两者都会带来额外的计算成本,应尽量避免。使用泛型可以有效减少装箱拆箱操作,提高代码效率和类型安全性。
摘要由CSDN通过智能技术生成

1、装箱:值类型转换成引用类型

装箱时将发生:

  • 在托管堆分配内存,分配的内存大小是值类型各字段所需的内存大小之和,还要加上托管堆所有对象都有的两个额外成员(类型对象指针和同步块索引)所需的内存量

  • 值类型的字段复制到新分配的堆内存

  • 返回对象地址,该地址是对象引用:值类型成了引用类型

  • 该对象一直存在于堆内存中,直至被垃圾回收

2、拆箱:获取已装箱的堆内存上对象的各个字段地址,是一个获取指针地址的过程

拆箱时将发生:

  • 如果包含“对已装箱值类型实例引用”的变量为null,抛出NullReferenceException异常

  • 如果引用的对象不是所需值类型的已装箱实例,抛出InvalidCastException异常

  • 将该对象从实例复制到值类型中

装箱

装箱需要显示执行,而拆箱可以隐式执行

                                                                        拆箱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值