栈、堆、值类型、引用类型的说明和之间关系

  程序运行时,它的数据必须存储在内存中,一个数据项需要多大的内存、存储在什么地方、以及如何存储都依赖于数据项的类型。

运行中的程序使用两个内存区域来存储数据:栈和堆。

  栈是一个内存数组,是一个LIFO(last-in、first-out,后进先出)的数据结构,栈存储3种类型的数据:分别是值类型变量的值;程序当前的执行环境;传递给方法的参数。

  栈有如下几个普遍特征,分别是:数据只能从栈的顶端插入与删除;把数据放到栈顶称为入栈;从栈顶删除数据称为出栈。

  堆是一块内存区域,在堆里可以分配大块的内存用于存储引用类型对象,与栈不同,堆里的内存能够以任意顺序存入和移除。虽然程序可以在堆里保存数据,但并不能显式的删除它们,CLR的自动GC(Garbage Collector,垃圾收集器)在判断出程序的代码将不会再访问某数据项时,自动清除无主的堆对象。

值类型和引用类型

  值类型是一种类型数据的复制占有(即不存在多个变量共用一个值),只需要一段单独的内存,用于存储实际的数据,对于值类型而言,数据存放在栈里(不一定总是存放在栈里)。引用类型是一种对数据地址的引用(即可以存在多个变量共用一个值),需要两段内存,第一段存储实际的数据,它总是位于堆中;第二段是一个引用,指向数据在堆中的位置,存放在栈里。

  特别注意:值类型对象,或引用类型数据的引用部分可以存放在堆里,也可以存放在栈里,这依赖于实际环境。

  例如:假设有一个引用类型的实例,名称为MyType,它有两个成员:一个值类型成员A和一个引用类型成员B。它将如何存储,对于一个引用类型,其实例的数据部分始终存放在堆里,既然两个成员都是对象数据的一部分,那么它们都会被存放在堆里,无论它们是值类型还是引用类型。而且成员B的引用部分(即数据的指向位置)是存放在堆中的。

  C#中值类型和引用类型表格

 

值类型

引用类型

预定义类型

Sbyte、byte、float、short、ushort、double、int、uint、char、long、ulong、decimal、bool

Object、string、dynamic

用户定义类型

Struct、enum

Class、interface、delegate、array

posted @ 2013-11-14 22:25  殇曲?  阅读(1195)  评论(0编辑  收藏  举报