随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万

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方法强制到驻留池中查找。

posted on   Andy Niu  阅读(247)  评论(0编辑  收藏  举报
编辑推荐:
· 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编程运行原理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示