c#中值类型和引用类型的存储区别
运行环境:visual studio \ .Net 4.5
c#中数据类型可根据存储方式的不同分为值类型和引用类型,也就是标题中的两种
查看方法: 有兴趣可以自己尝试一下。在VS中加入断点(F9 添加,左侧会出现一个小红点),按F10 一行一行运行(左侧箭头所指的为即将运行的,而不是已运行的),右下角的窗口选项卡点击即时窗口,输入 &变量名 可查看数据存储的十六进制地址,输入十六进制地址 查看地址数据。如图
下面开始正题
如下图所示,num储存的方式为
即数据类型、数据名、都存放在栈中,与它相似的还有char、bool、float…
这类数据类型的赋值都是重新在栈中开辟一块空间,再将数据存放在空间中,如图
那么修改num2肯定不会改变num的值,因为它们的存储地址不同,一个是0x0617e778,另一个是0x0617e774,如图
引用类型
引用类型,顾名思义,即数据不是存放在栈中,而是存放在堆中,栈中只存放堆的地址,如图
此类大多数为数组,比如int[]、char[]、float[]、bool[]、string[]…
此类数据的赋值只是在栈中开辟一块空间,存储数据类型、数据名、以及真实数据在堆中的地址
可以看到,新声明的 int[] nums2 栈地址与 nums不同,但他们指向的堆地址相同,再尝试修改num2[0] 的值,输入 nums[0] 的值
两个数组指向的地址还是相同,且nums[0] 的值也变为了4 ,可知,引用类型的数据修改只会修改堆中的数据,修改后指向该堆的数据都会改变
string类型
该类型很特殊,存储方式与引用类型一样,但是它的赋值与修改有另一套机制
对其中一个进行修改,发现修改的变量指向的堆地址发生了改变,也就是重新开辟了一块空间给被改变量。
那么是不是意味着之后重新修改该变量,就会修改堆内数据,而不是再才开辟空间呢?
结果发现,修改变量后,再次开辟了一块空间,而不是修改原堆中的数据。那么被丢弃的空间被回收了吗?
由此可知,str1丢弃的空间任然存放在堆中等待回收。