请解释在 C# 中,字符串不可变性的底层实现机制是怎样的?
考察说明
考察对 C# 字符串不可变性原理的理解,包括存储方式和操作机制。
回答思路
- 【回答框架 1】字符串在托管堆中以 UTF-16 字符数组形式存储,由 System.String 类型表示。其内容在创建后即被固定,所有公开的修改方法实际都会创建新字符串实例,原实例保持不变。
- 【回答框架 2】CLR 通过引用计数和托管堆管理字符串生命周期,字符串对象一旦分配,其内部字符缓冲区不会被修改。任何对字符串的修改操作都返回新对象,这是由字符串类型的设计和运行时支持共同保证的。
- 【回答框架 3】特殊机制包括字符串驻留:编译期或运行时,相同内容的字符串字面量可能指向同一个实例,但运行时动态创建的字符串默认不驻留,除非显式调用 Intern 方法。
- 【回答框架 4】不可变性带来了线程安全、哈希稳定等优点,但频繁修改字符串会导致大量对象分配,应使用 StringBuilder 避免性能问题。
- 【关键点 1】字符串对象创建后内容只读,修改操作返回新字符串实例。
- 【关键点 2】底层采用 UTF-16 字符数组存储,分配在托管堆。
- 【关键点 3】字符串驻留机制可使相同字面量共享实例,但动态字符串需显式驻留。
- 【关键点 4】不可变性保证线程安全和引用传递的稳定性。
- 【易错点 1】混淆字符串的引用可变性与内容不可变性:变量可以指向新字符串,但原对象不变。
- 【易错点 2】误以为所有相同字符串都自动驻留,实际上只有字面量和 Intern 才驻留。
- 【易错点 3】忽略频繁字符串操作的性能开销,应使用 StringBuilder。