请说明在 C# 中 string 和 StringBuilder 的主要区别,并解释在什么场景下应该选用 StringBuilder?
考察说明
考察对 C# 字符串不可变性与可变字符缓冲区机制的理解,以及在实际开发中的选型能力。
回答思路
- 【回答框架 1】string 是引用类型但具有不可变性,任何修改操作(如拼接、替换)都会生成新的字符串对象;StringBuilder 维护一个可变字符缓冲区,修改操作在缓冲区上直接进行,避免频繁创建新对象。
- 【回答框架 2】当进行大量字符串拼接(如循环中多次 += )时,string 会创建大量中间字符串,导致内存分配与垃圾回收开销;StringBuilder 通过扩容机制和直接修改缓冲区,性能更优。
- 【回答框架 3】StringBuilder 使用场景包括动态拼接长字符串、循环拼接、以及需要反复修改字符串内容的场景;如果字符串内容固定或修改次数很少,直接用 string 即可。
- 【回答框架 4】使用 StringBuilder 时要注意默认容量,容量不足时会自动扩容(通常翻倍),可能涉及数组复制;初始化时可以预估容量以减少扩容。
- 【回答框架 5】线程安全方面,string 不可变性使其天然线程安全,StringBuilder 非线程安全,多线程并发修改需要外部同步。
- 【关键点 1】string 不可变,修改需新建对象;StringBuilder 可变,直接操作缓冲区。
- 【关键点 2】循环或大量拼接时优先用 StringBuilder 避免性能浪费。
- 【关键点 3】少量修改或固定字符串可直接用 string,代码更简洁。
- 【关键点 4】StringBuilder 可预估容量减少扩容复制成本。
- 【关键点 5】string 线程安全,StringBuilder 需自行处理并发同步。
- 【易错点 1】误以为 StringBuilder 总是更快,在少量拼接或字符串很短时,string 因简单操作反而可能更高效。
- 【易错点 2】忽略 StringBuilder 容量初始值,频繁扩容会增加开销。
- 【易错点 3】在循环外拼接大量字符串时使用 string 导致内存压力,应避免。