您的位置:首页 > 其它

第5章:基元类型、引用类型和值类型

2017-12-08 15:53 260 查看
5.3 值类型的装箱和拆箱

1.为什么说值类型比引用类型”轻”,原因是什么?

2.为什么要装箱?

3.什么是装箱?

4.装箱时,实际发生了什么?

5.我们为什么要理解装箱/拆箱?

6.泛型集合类相对非泛型集合类的好处?

7.什么是拆箱?

8.拆箱时,实际发生了什么?

9.分析拆装箱的例子,具体理解装箱和拆箱。

10.用代码解析,未装箱的值类型能做什么,不能做什么,为什么?

………………………………………………………………………………

………………………………………………………………………………

………………………………………………………………………………

………………………………………………………………………………

………………………………………………………………………………

………………………………………………………………………………

1.为什么说值类型比引用类型”轻”:

(1)不作为对象在托管堆分配

(2)不被垃圾回收

(3)不通过指针进行引用

原因:

(1)不在托管堆上分配

(2)没有堆上每个对象都有的额外成员:”类型对象指针”,”同步索引块”

2.为什么要装箱

很多时候需要获取对 值类型实例 的引用,就需要把 值类型实例 变成 引用类型实例,这就是装箱。

3.装箱是什么?

值类型转换成引用类型,就叫作:装箱。

4.装箱时,实际发生了什么?

(1)托管堆中分配内存:分配的内存量就是值类型各字段所需的内存量,再加上堆上每个对象都会有的两个额外成员(“类型指针”,“同步索引块”)的内存量。

(2)值类型的字段到复制到新分配的堆内存

(3)返回对象地:该地址就是对象的引用。

5.我们为什么要理解装箱/拆箱?

C#会自动生成对值类型实例进行装箱所需要的IL代码,但我们仍需要理解其内部的工作机制,才能对代码的长度和性能做到心中有数。

6.泛型集合类相对于非泛型集合类的好处?

(1)开发人员在操作值类型的时候不用进行装箱和拆箱操作

(2)因为减少了堆中对象的创建,引用程序执行的时候减少了垃圾回收的次数

(3)开发人员获得了编译时的类型安全性

(4)源代码因强制类型转换次数的减少而变的清晰

7.什么是拆箱?

(1)将已装箱为引用类型的值类型,重新转换为值类型,就叫做拆箱。

(2)获取已装箱的对象的各个字段的地址,叫做拆箱。

(3)拆箱其实就是指获取指针的过程,该指针指向包含在一个对象中的原始值类型(数据字段)

(3)拆箱不是装箱的逆过程,拆箱不装箱的代价要低的多。

8.拆箱时,实际发生了什么?

(1)获取已装箱对象的各字段的地址

(2)将字段包含的值从堆复制到基于栈的值类型实例中

备注:

如何对已装箱的值类型的值进行更改

(1)拆箱为值类型

(2)更改值类型的值

(3)装箱为引用类型

代码:

struct Point()
{
public Int32 x,y;
}
public void Main()
{
Point p;
p.x=1;
p.y=1;
Object o=p;//装箱
//接下来对o进行更改
p=(Int32)o;//拆箱
p.x=2;//改值
o=p;//重新装箱

}


已装箱的对象在拆箱时,可能会发生以下错误
(1)如果包含“对已装箱值类型实例的引用”的变量为null,会抛出NullRefernceException异常
(2)如果引用的对象不是所需值类型的已装箱实例,会抛出InvalidCastException异常


Int32 v=5;
Object o=v;//装箱,o引用已装箱对象
Int16 oo=(Int16)o;//报InvalidCaseException错误,因为在对对象进行拆箱时,只能转换成最初未被装箱的值类型,本例中是Int32
//正确写法
Int32 v=5;
Object o=v;//装箱
Int16 oo=(Int16)(Int32)o;


9.分析拆装箱的例子,具体理解装箱和拆箱
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: