Posted on 2006-08-16 15:06
东人EP 阅读(216)
评论(0) 编辑 收藏 引用 所属分类:
.NET
2
、引用类型与值类型
2.1
值类型
整数类型、浮点数类型、
Decimal
类型、
Boolean
类型、
Character
类型、结构体类型、枚举类型均为值类型。值类型是在堆栈中分配空间,系统定义值类型例子:
int a = 10; a
à
int b = 20; b
à
a = b; a
à
b
à
2.2
引用类型
Object
类型、
String
类型、
Class
类型、
Interface
类型、数组、委托均为引用类型。
String
类型是一种特殊的引用类型,引用类型是在托管堆中分配空间的,系统定义应用类型例子:
Class A {
Public int id;
}
Class B{
Public int id;
}
A a = new A();
B b = new B();
a.id = 10; a
à
b.id = 20; b
à
a = b; a
b
à
2.3
装箱和拆箱
装箱的过程就是把值类型转变为应用类型的过程,拆箱则是把引用类型转变为值类型的过程,见如下例子:
int a = 10;
object o = a;
此为装箱的过程,
object o = 10;
int a = (int)o;
此过程则为拆箱过程。
装箱操作的步骤:
n
从托管堆中为新生成的引用类型对象分配内存。分配内存的大小为,值类型实例本身的大小及其他额外的将值类型实例视为真正的引用实例所需的空间,这些额外的空间包括一个方法表指针和一个
SyncBlockIndex
。
n
将值类型实例的字段拷贝到托管堆上新分配对象的内存中。
n
返回托管堆新分配对象的地址,该地址就是一个指向对象的引用,值类型实例也就变成了一个引用类型对象。
拆箱操作的步骤:
n
如果该引用为
null
,则会抛出一个
NullReferenceException
异常。
n
如果该引用指向的对象不是一个期望的值类型的装箱对象,将会抛出一个
InvalidCastException
异常。
n
一个指向包含在已装箱对象中值类型部分的指针被返回。
拆箱的操作代价要不装箱小的多。装箱和拆箱不严格意义上的互反操作。