String到底是值类型还是引用类型(C#)
c# string 类型 引用 还是 到底
2023-09-11 14:16:45 时间
MSDN 中明确指出 String 是引用类型而不是值类型,但 String 表面上用起来却像是值类型,这又是什么原因呢?
首先从下面这个例子入手:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
输出结果:
- 1
- 2
- 3
从运行结果可以看出:str2 的值还是 ab ,并没有随着 str1 值的改变而改变。如果string是引用类型,按理Str1和Str指针都指向同一内存地址,如果Str的内容发生改变,Str1应该也会相应变化。此例子,看着string更像是值类型。 但是MSDN却说String是引用类型。究其原因,是因为string对象是不可变的,包括长度和其中任何字符都是不可以改变的。
String的不变性
string 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。有的时候看来似乎修改了,实际是string经过了特殊处理,每次改变值时都会建立一个新的string对象,变量会指向这个新的对象,而原来的还是指向原来的对象,所以不会改变。这也是string效率低下的原因。如果经常改变string的值则应该使用StringBuilder而不使用string。
在例子中str1=”ab”,这时在内存中就将“ab”存下来,如果再创建字符串对象,其值也等于“ab”,str2=”ab”,则并非再重新分配内存空间,而是将之前保存的“ab”的地址赋给str2的引用,这就能印证例子2中的结果。而当str1=”abc”其值发生改变时,这时检查内存,发现不存在此字符串,则重新分配内存空间,存储“abc”,并将其地址赋给str1,而str2依然指向“ab”的地址。可以印证例子中的结果。
结论
String是引用类型,只是编译器对其做了特殊处理。
相关文章
- 快速傅立叶变换(FFT)的C#代码
- C#中的OLEDB连接2
- C#基础视频教程4.3 如何编写简单的计算器
- C#写的NoSQL开源项目/系统(系列)
- C#基础知识系列三(类和结构体、String和StringBuilder、equals和==)
- C#中string.format用法详解
- c# string 扩展方法
- C# 格式化string类型的金额
- C# String 前面不足位数补零的方法
- C# string格式的日期时间字符串转为DateTime类型
- C# 等待另外一个窗体关闭,再进行主线程的代码
- C#中 String 格式的日期时间 转为 DateTime
- C# 日志类
- C#中如何比较2个string类型的日期大小?
- C# FTP上传下载(支持断点续传)
- C# 格式化string类型的金额
- Atitit.线程 死锁 跑飞 的检测与自动解除 与手动解除死锁 java c# .net php javascript.
- C# byte数组转换成List<String>
- c# - 数据类型转换和控制台输入
- (43)C#里使用WeifenLuo.WinFormsUI.Docking库时是怎么样保存当前布局?
- C# string.Format
- C#创建Windows窗体应用程序实例8【通用对话框】