C# 中的装箱和拆箱
时间:2011-05-16 来源:NO.8
今天在园子里看到 bigmonster 关于.NET 笔试题的帖子,题目如下:
a、下面三句代码有没有错,以inboxing或者unboxing为例,解释一下内存是怎么变化的
int i=10;
object obj = i;
int j = obj;
分析:在inboxing时是不需要显式的类型转换的,不过unboxing需要显式的类型转换,所以第三行代码应该改为:
int j = (int)obj;
要掌握装箱与拆箱,就必须了解CTS及它的特点。
NET重要技术和基础之一的CTS(Common Type System)。顾名思义,CTS就是为了实现在应用程序声明和使用这些类型时必须遵循的规则而存在的通用类型系统。.Net将整个系统的类型分成两大类 ——Value Type 和 Reference Type。。,多数的OO语言存在这个弱点,原因就是因为他们的原类型没有共同的基点,于是他们在本质上并不是真正的对象C++更依赖于对象,而非面向对象。.Net环境的CTS 给我们带来了方便。第一、CTS中的所有东西都是对象;第二、所有的对象都源自一个基类——System.Object类型。这就是所谓的单根层次结构(singly rooted hierarchy)关于System.Object的详细资料请参考微软的技术文档。CTS Value Type的一个最大的特点是它们不能为null,Value Type的变量总有一个值。在传递Value Type的变量时,实际传递的是变量的值,而非底层对象的“引用”。CTS Reference Type就好像是类型安全的指针,它可以为null。当值为null时,说明没有引用或类型指向某个对象。声明一个引用类型的变量时,被操作的是此变量的引用(地址),而不是数据。
使用这种多类型系统时如何有效的拓展和提高系统的性能?就是今天探讨的问题,西雅图人提出了Box and UnBox的想法。简言之,装箱就是将value type转换为reference type;反之,就是拆箱。
1 int i = 10; /// 定义一个值形变量
2 object obj = i; /// 将变量的值装箱到 一个引用型对象中
当i被装箱时所发生的过程:
(1)划分堆栈内存,在堆栈上分配的内存 = i[int]的大小 + obj及其结构所占用的空间;(2) i的值(10)被复制到新近分配的堆栈中;
(3)将分配给obj的地址压栈,此时它指向一个object类型,即引用类型。
1 int i = 10;
2 object obj = i;
3 int j = (int)obj;
第一步将一个值压入堆栈;
第二步将引用类型转换为值类型;
第三步间接将值压栈;
第四步传值给j。