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

请解释 C# 的字符串驻留机制,并说明其工作原理和适用场景。

性能优化风险判断技术原理C#

考察说明

考查对 C# 字符串驻留底层实现和内存优化机制的理解。

回答思路

  1. 【回答框架 1】字符串驻留是 CLR 对字符串字面量进行缓存复用的一种机制:当编译器在程序集中定义字符串字面量时,会将其放入元数据,运行时加载时将这些字符串加入内部的驻留池(Intern Pool),并在内存中只保留一份副本。
  2. 【回答框架 2】当代码中出现相同的字符串字面量时,CLR 会直接引用驻留池中已有的对象,而不是新建字符串对象,这样减少内存占用并提高比较效率。
  3. 【回答框架 3】驻留池是进程级别的哈希表,以字符串内容为键;字符串比较时,驻留字符串可以使用引用相等(Object.ReferenceEquals)快速判断,但普通运行时拼接产生的字符串不会自动驻留。
  4. 【回答框架 4】可以通过 string.Intern 方法显式将动态构造的字符串加入驻留池;但过度使用可能导致驻留池膨胀,因为驻留的字符串不会被垃圾回收,从而长期占用内存。
  5. 【回答框架 5】了解驻留机制有助于性能优化,但实际开发中应谨慎使用 Intern,避免内存膨胀;对于大量重复的字符串,可先评估内存与性能的平衡。
  6. 【关键点 1】驻留池是 CLR 内部维护的字符串字典,用于复用相同内容的字符串字面量。
  7. 【关键点 2】仅字面量在默认情况下驻留,动态生成的字符串需要显式调用 Intern 才能驻留。
  8. 【关键点 3】驻留字符串之间可以使用引用相等比较,提升比较性能。
  9. 【关键点 4】缺点:驻留池中的字符串不会被 GC 回收,可能造成内存压力。
  10. 【易错点 1】误以为所有字符串都自动驻留,导致对动态字符串使用 Intern 不当。
  11. 【易错点 2】忽视驻留池的内存副作用,在大量动态字符串上滥用 Intern 造成内存膨胀。
  12. 【易错点 3】混淆字符串内容相等和引用相等,在未驻留字符串上使用引用比较得到错误结果。