C# string
1、string 是不可变的
每次对string的修改,都相当于重新创建一个string对象(驻留池中没有),返回引用。string是一个特殊的引用类型,具备值类型的特点。一般的引用类型,修改引用使其指向另一个对象,与修改引用对象的内容,是两个完全不同的概念。但是,对于string类型,对string内容的修改,会导致指向另一个string对象。因此,对于字符串频繁变化的情况,强烈建议使用StringBuilder
2、为什么把string设计成不可变的?
首先,string是程序中用到最多的类型,把string设计成不可变的,不会发生线程同步的问题。A线程访问string变量str,把str传递给str2,线程B对str2的修改,不会影响str。
其次,把string设计成不可变的,意味着,内容相同的引用可以指向同一块内存,节约内存。
3、怎么实现的?
CLR初始化创建一个哈希表,在这个表中,key是字符串,value是是对字符串的引用。当一个新的string对象,初始化为文本常量,首先检查哈希表中是否包含该文本常量。如果包含,返回已经存在的引用。如果不包含,新建string对象,添加到哈希表,并返回引用。这样,就避免了重复分配内存。除非卸载AppDomain或者进程终止,否则内部哈希表的string对象不能被释放。
4、驻留池注意事项
只有文本常量的字符串才会进入驻留池,其他方式新建的字符串不会进入,也就是说,相同字符串在内存中可能会有多个拷贝。为了解决这个问题,可以使用String.Intern方法强制到驻留池中查找。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理