CS2L5——特殊的引用类型string

回顾值类型与引用类型

  • 引用类型:string​ 数组 类(未学习)
  • 值类型:其他类型 结构体(未学习)

值类型 在相互赋值时 把内容拷贝给了对方 它变我不变
引用类型 在相互赋值时 是 让两者指向同一个值 它变我也变

为什么有这样的区别
值类型和引用类型 存储在内存的区域是不同的 存储方式是不同的

  • 值类型 存储在 栈空间 —— 系统分配,自动回收,小而快
  • 引用类型 存储在 堆空间 —— 手动申请和释放,大而慢,引用类型的地址存储在栈空间里,地址指向堆空间里的数据

特殊的引用类型string

因为 string​ 是引用类型 按理说 应该是“它变我也变”,
但是 C# 做了特别处理,让 string​ 非常的特殊 它具备 值类型的特征 即“它变我不变”

1
2
3
4
5
string str1 = "123";
string str2 = str1;
str2 = "321";
Console.WriteLine(str1);
Console.WriteLine(str2);

输出:

1
2
123
321

string str2 = str1​ 时,栈空间内还是将 str1​ 的地址拷贝到 str2​ 了
但是在 str2 = "321"​ 时,重新赋值让其在堆空间中重新分配了空间,同时让 str2​ 指向了新空间
因此 string​ 具备了值类型的特征

因此 string​ 虽然方便,但是有一个缺点,就是频繁的改变 string​ 重新赋值,会产生内存垃圾
因为会有很多的字符串被复制出来占用内存,由此会有优化的替代方案,例如后续的 stringBuilder

查看内存消息

通过断点调试可以在监视窗口可以查看内存消息

image