概述
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.分析拆装箱的例子,具体理解装箱和拆箱
最后
以上就是如意翅膀为你收集整理的第5章:基元类型、引用类型和值类型的全部内容,希望文章能够帮你解决第5章:基元类型、引用类型和值类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复