C#面试题更新 2026-08-05

请说明在 C# 中 string 和 StringBuilder 的主要区别,并解释在什么场景下应该选用 StringBuilder?

技术原理方案权衡C#

考察说明

考察对 C# 字符串不可变性与可变字符缓冲区机制的理解,以及在实际开发中的选型能力。

回答思路

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