堆(Heap):在c里面叫堆,在c#里面其实叫托管堆。
栈(Stack):就是堆栈,简称栈。
变量储存到两个地方:栈(堆栈)、堆(托管堆,安全,受CLR管理)
值类型数据存储到栈上,引用类型的数据存储到堆上。
栈和堆是内存上面的两个区域。
栈上存储的数据量小。堆上存在的数据量大。
值类型会把数据的值直接存在栈上,在存储和读取数据方便比堆相对快。
引用类型会把数据的值存在到堆上,而在栈上存储的仅仅是个地址(也称引用或指针)。
栈上的地址和堆上的值有联系,通过栈上的地址可以去堆上找到某个值。
栈上的空间有顺序的,是连续的,先进后出。而堆上的空间是无序,散列的。
//值类型
int a = 10;
short b = 20;
long c = 30;
bool d = false;
string虽然是引用类型,在栈上分配一个地址,在堆上分配一个值。
默认同一个值在堆上只占一个空间,理论上修改str1会影响str2,但实际上不是这样的。
string比较特殊,str1和str2会使用常量池
为什么修改了str1不会影响str2?
在修改str1之前,str1和str2同时指向堆上的“hello”空间,修改了str1后,给str1在堆重新分配了新的空间“HELLO”,而原来的空间给str2自己单独使用了。
string str1 = "hello";
string str2 = "hello";
Console.WriteLine("str1的值:" + str1 + ",str2的值:" + str2);
str1 = "HELLO";
Console.WriteLine("str1的值:" + str1 + ",str2的值:" + str2);
/*null:无效的;零值的;等于零的;空位;无信号;数字零;空白符号;*/
str1 = null;
str2 = null;
str2 = ""; // 空字符串
在C#中,栈和堆是两种内存管理方式。
栈主要用于存储方法中的变量(值类型),系统自动分配和释放;
堆主要用于动态分配内存(引用类型),大小不固定,由GC(垃圾回收器)回收。
特点:
栈的特点:数据使用之后自动销毁;存放局部变量、对象的引用地址等;数据访问速度比堆快。
堆的特点:动态分配内存;大小不固定;可以由GC自动回收。
这五个区是:栈区、堆区、常量区、静态区、代码区