---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
栈指堆栈,堆指托管堆。两者是可用内存的两个区域,其中堆栈用于存储非实例变量的值类型数据,以及引用类型的变量(用于存储引用类型实例),而托管堆用于存储引用类型实例的数据及相关信息。不但存储内容不同,堆栈和托管堆的内存分配方式也不同,下面通过一个实例说名两者的区别。
class Program
{
static void Main(string[] args)
{
//声明两个Int变量
int i = 50;
int i = 80;
//声明三个引用test实例的变量
test a = new test();
test b = new test();
test c = b;
//声明ii变量,将i的值赋值给ii
int ii = i;
//重新赋值给ii
ii = 10;
//声明jj变量,将j变量的值赋值给jj
int jj = j;
}
}
class test
{
//.....
}
本程序没有任何的输出,实际运行时堆栈和托管堆中的数据存储情况如下图所示:

这是一个简化的示意图,表示本程序数据在内存中的存储情况。堆栈从内存地址高位开始存储数据,而托管堆从内存地址低位开始存储数据。
堆和栈都有相应的指针,指向下一个可用的内存地址,不过两者方向相反,值类型变量的赋值很明显只是赋值了副本,例如i和ii之间独立存在。
引用类型的变量指向实例的实际数据,赋值操作的是同一个实例的地址引用,例如b和c指向相同的test实例。
由此可知,堆栈和托管堆是程序内存空间可用的两个区域。栈用于存储非对象的值类型数据和引用类型实例的地址引用,而堆用于存储由new创建的引用类型的实例,
引用类型变量存储实例的地址引用,已达到访问实例的目的。不过栈的数据清除和堆的数据清除有很大的不同,栈的值类型数据超出了作用域时将被清除,而堆中的实例在没有被任何变量引用时才有可能在某个时间呗清除,堆的数据清除交给垃圾收集器完成。
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------