您的位置:首页 > 编程语言 > C#

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

2016-05-24 21:04 561 查看

装箱与拆箱

值类型不需要再托管堆中分配,不被垃圾回收,不通过指针引用,

但很多时候我们往往需要获取对值类型实例的引用

比如传一个值类型实例作为实参

然而形参有时确实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.再讲字段包含的值从堆赋值到基于栈的值类型实例中。

可见装箱代价比较大,在代码中要避免重复装箱
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: