包含:结构和枚举(值类型都隐式的继承自system.ValueType)
栈(stack)是一种后进先出的结构、用来处理存放变量
堆(heap)是为了对引用类型实例(对象)分配空间的内存区域,在堆上创建的对象会将其地址传递给变量进行处理
看下面的代码
public struct ValPoint{ public int x; public ValPoint(int x){ this.x=x; } }
上面定义了一个值类型
在程序中写下代码
ValPoint valPoint;
则会在栈上创建一个变量valPoint,并且此变量将会包括所有的字段和属性
ValPoint valPoint=new ValPoint();
new操作符在值类型实例化一个对象的时候,并不会再堆上创建一个实例,仅仅是作为初始化值类型valPoint变量的字段值,在值类型中都会将值类型中的变量的值初始化为0.
1.=左边ValPoint valPoint,在线程栈上创建一个ValPoint类型的变量vPoint,结构中的所有成员的没有赋值.在进行new ValPoint()之前,将vPoint压到栈上
2.=右边的new ValPoint(),new操作符并不会分配内存,也不是创建实例。它仅仅是调用ValPoint结构的默认构造函数,根据构造函数去初始化vPoint结构的所有字段
包括:接口、类、委托等
public class RefPoint{ public int x; public RefPoint(int x){ this.x=x; } }
在程序中写下代码
RefPoint reflPoint;
声明一个引用类型的变量,在线程栈上创建一个不包含任何地址数据的变量
RefPoint reflPoint=new RefPoint(1);
使用new操作符后,在应用程序的堆上创建一个引用类型对象的实例,并为它分配内存地址,自动传递该实例的引用给构造函数
包括:int、byte
装箱:将值类型转换为引用类型
1.在堆上位新生成的对象实例分配内存.该对象实例包含数据,但它没有名称
2.将栈上值类型变量的值可复制到堆上对象中
3.将堆上创建的对象地址返回给引用类型变量
拆箱:将引用类型转换为值类型
public class RefPoint{ public int x; public RefPoint(int x){ this.x=x; } } public struct ValPoint{ public int x; public ValPoint(int x){ this.x=x; } }
RefPoint rPoint1=new RefPoint(1); RefPoint rPoint2=rPoint;
原文:http://www.cnblogs.com/ilooking/p/4356927.html