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

在 C# 中,string 被定义为引用类型,但它在日常使用中却表现出类似值类型的行为,例如可以直接用 == 比较内容以及直接赋值。请解释这种看似矛盾的现象背后的设计原理与实现机制。

技术原理C#

考察说明

考查对 C# 字符串类型底层实现与语言设计特性的理解。

回答思路

  1. 【回答框架 1】string 在 C# 中是引用类型,其变量保存的是堆上对象的引用,而非字符串本身。
  2. 【回答框架 2】但 string 类型重载了 == 和 != 运算符,使其比较的是字符串内容而非引用地址,这就是它表现像值类型比较的原因。
  3. 【回答框架 3】此外,string 是不可变类型,每次修改都会创建新对象,因此赋值操作本质上是让变量引用新的字符串对象,但感觉上像值类型赋值。
  4. 【回答框架 4】C# 还实现了字符串驻留机制,相同内容的字符串字面量可能共享同一实例,但这不影响内容比较的语义。
  5. 【回答框架 5】综上所述,string 之所以像值类型,是因为语言在运算符重载和不可变性上做了特殊设计,其底层仍是引用类型。
  6. 【关键点 1】string 是引用类型,变量存储引用。
  7. 【关键点 2】string 重载了 == 和 !=,比较内容。
  8. 【关键点 3】string 不可变,修改生成新对象。
  9. 【关键点 4】字符串驻留可复用实例,但比较仍是内容。
  10. 【易错点 1】不要误以为 string 是值类型,它本质是引用类型。
  11. 【易错点 2】不要认为 == 总是比较引用,对 string 是内容比较,但其他引用类型默认仍是比较引用。
  12. 【易错点 3】不要忽略 string 不可变性对性能和内存的影响,频繁修改字符串会导致大量对象创建。