CLR Via C# 第五章(基元类型,引用类型与值类型)(2)——读书笔记

装箱与拆箱

值类型不需要再托管堆中分配,不被垃圾回收,不通过指针引用,
但很多时候我们往往需要获取对值类型实例的引用
比如传一个值类型实例作为实参
然而形参有时确实Object类型
形如

Int32 a=0;
Object obj=(Object )a;

这类操作称作装箱,即值类型换成引用类型。
装箱步骤
1.在托管堆中分配内存,分配的内存量是值类型各字段所需要的内存量再加上两个额外成员(类型对象指针+同步块索引)
2.值类型字段复制到新分配的堆内存。
3.返回对象地址,现在该地址是对象引用。

然而对于拆箱,

Point p;
Arraylist a=new ArrayList();
a.Add(p);
p=(Point)a[0];

最后一个语句为拆箱
则一个已装箱的对象中所有字段赋值到值类型p中,p在栈中
1.获取已装箱对象中各个Point字段地址,这步称为拆箱
2.再讲字段包含的值从堆赋值到基于栈的值类型实例中。

可见装箱代价比较大,在代码中要避免重复装箱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值