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

在 C# 中,值类型与引用类型之间有哪些关键差异?请从存储位置、赋值行为、参数传递和性能影响等方面进行说明。

考察说明

考查对 C# 类型系统中值类型与引用类型核心区别的理解,包括内存分配、赋值语义和参数传递机制。

回答思路

  1. 【回答框架 1】值类型直接存储其数据,通常分配在栈上(或作为引用类型的一部分内联存储),而引用类型存储对堆上对象的引用,栈上只保存引用地址。
  2. 【回答框架 2】赋值行为不同:值类型赋值会复制整个数据,两个变量互不影响;引用类型赋值仅复制引用,两个变量指向同一对象,修改一个会影响另一个。
  3. 【回答框架 3】参数传递默认按值传递,但值类型传递的是数据副本,方法内修改不影响原变量;引用类型传递的是引用副本,方法内修改对象内容会影响原对象,但重新赋值引用不影响原变量。
  4. 【回答框架 4】性能方面,值类型通常分配在栈上,访问速度快,但复制开销大;引用类型分配在堆上,有垃圾回收开销,但复制引用成本低。选择时需权衡数据大小和生命周期。
  5. 【回答框架 5】值类型包括所有数值类型、bool、char、struct 和枚举;引用类型包括类、接口、委托、数组和 string(string 虽为引用类型,但具有不可变性)。
  6. 【关键点 1】值类型存数据,引用类型存引用地址。
  7. 【关键点 2】值类型赋值复制数据,引用类型赋值复制引用。
  8. 【关键点 3】参数传递默认按值,但引用类型传递的是引用副本。
  9. 【关键点 4】值类型分配在栈或内联,引用类型分配在堆。
  10. 【关键点 5】string 是引用类型但不可变,行为上类似值类型。
  11. 【易错点 1】不要误认为所有值类型都分配在栈上,作为类字段时内联在堆上。
  12. 【易错点 2】不要混淆引用类型参数传递与按引用传递(ref/out),前者仍按值传递引用副本。
  13. 【易错点 3】不要忽略 string 的不可变性,修改 string 会创建新对象。