C#语言--------------字符串的不可变性

在C#语言中数据分为值类型和引用类型,值类型数据存储在栈中,而引用类型数据存储在堆中,在堆中的地址将存储在栈中,调用时通过栈中的地址找到堆中的数据。例如字符串就是引用类型数据,而字符串的不可变性是指我们对字符串重新赋值,那么他的老值不会变(不会被覆盖)而是在堆中重新开辟一块空间


 

在上图中,当我们为值类型数据a重新赋值后老值将被新值取代,而当我们为引用类型数据str重新赋值后,老值"张三"不会被覆盖(销毁),而是在堆中重新开辟一块内存空间存"李四",同时用“李四”堆中的地址把栈中存放张三的地址覆盖。

 

 

当程序运行结束是GC会扫描整个内存,把没有指向的内存回收(包括存张三和李四的内存)

 

 

再例如:

      当我们对字符串str 和str1都赋值为“张三”时(即string str = "张三"; string str1 =“张三";),并不是在堆中开辟两个块内存分别都存上"张三"然后str和str1分别指向两块不同的内存,而是在堆中之开辟一块内存存储张三然后str和str1都指向存储“张三”的那一块内存,当我们把李四赋值给str1时,在内存中新开辟一块内存存储"李四",并用李四堆中的地址覆盖栈中原来存放“张三”的地址

 

我们通过即时调试验证两个"张三"只开辟一块内存来存储(设断点--->运行--->调试--->窗口--->即时,然后在即时窗口输入&str和&str1)  结果如下图

补错:我们发现str和str1在堆中的地址是相同的即只在堆中开辟一块内存空间存储“张三”。而str和str1在栈中的地址是不同的这点不是今天的主要内容。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值