C# 里的值类型与引用类型各自的定义是什么?在内存分配方面,两者存在哪些关键区别?
考察说明
考查对 C# 类型系统基础概念及内存分配机制的理解。
回答思路
- 【回答框架 1】值类型直接存储数据本身,分配在栈上或结构体内存中;引用类型存储的是对象的引用,对象分配在托管堆上。值类型如 int、float、bool、struct、enum;引用类型如 class、interface、数组、string 等。
- 【回答框架 2】值类型变量赋值时复制整个值,两个变量相互独立;引用类型赋值时复制引用,多个变量可能指向同一对象,修改一个变量会影响其他变量。
- 【回答框架 3】值类型在栈上分配时,生命周期由作用域决定,方法结束自动释放;引用类型在托管堆上分配,由垃圾回收器(GC)管理,生命周期不确定。
- 【回答框架 4】值类型可驻留在对象内部,如 class 中的 int 字段存储在堆上,但它是对象的一部分;装箱将值类型转换为 object 或接口类型时,会从栈复制到堆上,拆箱则相反。
- 【关键点 1】值类型存储数据值,引用类型存储对象引用。
- 【关键点 2】值类型通常在栈上分配,引用类型在托管堆上分配。
- 【关键点 3】值类型赋值复制数据,引用类型赋值复制引用。
- 【关键点 4】值类型装箱和拆箱造成性能开销。
- 【易错点 1】混淆值类型在 class 中的存储位置,误以为值类型字段一定在栈上。
- 【易错点 2】忽略字符串虽是引用类型但具有不可变性,修改操作实际上是创建新对象。
- 【易错点 3】忘记数组是引用类型,即使元素是值类型,数组本身在堆上。