C#语言--------------字符串的不可变性
在C#语言中数据分为值类型和引用类型,值类型数据存储在栈中,而引用类型数据存储在堆中,在堆中的地址将存储在栈中,调用时通过栈中的地址找到堆中的数据。例如字符串就是引用类型数据,而字符串的不可变性是指我们对字符串重新赋值,那么他的老值不会变(不会被覆盖)而是在堆中重新开辟一块空间
在上图中,当我们为值类型数据a重新赋值后老值将被新值取代,而当我们为引用类型数据str重新赋值后,老值"张三"不会被覆盖(销毁),而是在堆中重新开辟一块内存空间存"李四",同时用“李四”堆中的地址把栈中存放张三的地址覆盖。
当程序运行结束是GC会扫描整个内存,把没有指向的内存回收(包括存张三和李四的内存)
再例如:
当我们对字符串str 和str1都赋值为“张三”时(即string str = "张三"; string str1 =“张三";),并不是在堆中开辟两个块内存分别都存上"张三"然后str和str1分别指向两块不同的内存,而是在堆中之开辟一块内存存储张三然后str和str1都指向存储“张三”的那一块内存,当我们把李四赋值给str1时,在内存中新开辟一块内存存储"李四",并用李四堆中的地址覆盖栈中原来存放“张三”的地址
我们通过即时调试验证两个"张三"只开辟一块内存来存储(设断点--->运行--->调试--->窗口--->即时,然后在即时窗口输入&str和&str1) 结果如下图
补错:我们发现str和str1在堆中的地址是相同的即只在堆中开辟一块内存空间存储“张三”。而str和str1在栈中的地址是不同的这点不是今天的主要内容。