string 值类型还是引用类型
大家先来看一下下面的代码吧!
1 using System;
2 using System.Collections.Generic;
3
4 public class MyClass
5 {
6 public static void Main()
7 {
8 string s="abc";
9 string a=s;
10 s="def";
11 Console.WriteLine("{0},{1}",a,s);
12 }
13
14 }
2 using System.Collections.Generic;
3
4 public class MyClass
5 {
6 public static void Main()
7 {
8 string s="abc";
9 string a=s;
10 s="def";
11 Console.WriteLine("{0},{1}",a,s);
12 }
13
14 }
输出的是abc,def
我们都知道数组是引用类型的,请看一下段代码:
1 using System;
2 class MyClass
3 {
4 static void Main()
5 {
6 int [] Arr1={1,2,3,4,5};
7 int [] Arr2=Arr1;
8 Arr1[1] =200;
9 foreach (int i in Arr2)
10 Console.WriteLine(i);
11 }
12 }
2 class MyClass
3 {
4 static void Main()
5 {
6 int [] Arr1={1,2,3,4,5};
7 int [] Arr2=Arr1;
8 Arr1[1] =200;
9 foreach (int i in Arr2)
10 Console.WriteLine(i);
11 }
12 }
我们都知道值类型如果附值的时候,是把自己的一个副本附给另一个变量,之后它们互不影响。而引用类型则是把它在堆栈中的地址复制一份给另一个变量,它们的指向仍是一样的,所以当对一个变量进行操作的时候会影响到另外一个变量,所以上例中Arr2[1]=200而不是2。所以我们可以暂且认为string是值类型。
下面的一段代码再一次说明了它具有值类型的特征。
1 using System;
2 class MyClass
3 {
4 static void M(string s)
5 {
6 s="abcd";
7 }
8 static void Main()
9 {
10 string s="efgh";
11 M(s);
12 Console.WriteLine(s);
13 }
14 }
2 class MyClass
3 {
4 static void M(string s)
5 {
6 s="abcd";
7 }
8 static void Main()
9 {
10 string s="efgh";
11 M(s);
12 Console.WriteLine(s);
13 }
14 }
但实际上string是引用类型的(sorry,我水平有限,没办法证明),引用一下MSDN上的话:“String 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。看来似乎修改了 String 对象的方法实际上是返回一个包含修改内容的新 String 对象。”
大家看了这句话是不是有种恍然大悟的感觉了?让我把它说的更通俗点吧“重新赋值,就是在堆中重新分一块内存给它放新的值即重新NEW了一个对象,而不是覆盖原先的值是.而原先的值将等着CG来回收。”
那如果你想定义经常变的字符串,用string类的话,如果CG不能够及时回收,那不是很占用内存吗?
所以MS推荐了另一个类:
所以我个人对string的理解是,它是一个引用类型的,只不过是它拥有了值类型的特征!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述