一、核心本质区别(根本)
- 值类型:存实际数据,变量直接持有数据,赋值传副本(改副本不影响原数据)
- 引用类型:存内存地址(引用),变量指向堆上的实际数据,赋值传地址(改一个全影响)
二、栈 (Stack)/ 堆 (Heap) 分配规则(必背)
1. 栈分配(轻量、速度快、自动回收)
✅ 值类型:局部变量(方法内)、方法参数(非 ref/out)默认栈分配✅ 补充:结构体(struct)哪怕字段是引用类型,结构体本体仍在栈,字段指向堆
2. 堆分配(容量大、速度慢、GC 回收)
✅ 引用类型:所有对象(class / 数组 / 接口)必在堆,栈只存它的引用地址✅ 值类型堆分配 3 种特例(工业开发高频坑)
- 值类型作为引用类型的字段(如 class 里的 int 字段,随 class 对象入堆)
- 值类型被Boxing(装箱)(后文详说)
- 异步方法 / 迭代器中(await/yield),值类型会被编译器封装到堆上的状态机
三、Boxing(装箱)/Unboxing(拆箱) 完整解析
1. 定义(通俗讲)
- 装箱:值类型 → 引用类型(堆分配 + 数据拷贝,性能损耗)
- 拆箱:引用类型(装箱后的)→ 值类型(堆数据拷贝到栈,无新分配)⚠️ 拆箱必须拆到原类型,否则报错(如 int 装箱不能拆成 long)
2. 触发场景(工业开发高频触发点,必避)
- 值类型赋值给 object / 接口(如 int→object、int→IComparable)
- 值类型加入非泛型集合(如 ArrayList.Add (10),工业里老项目常见)
- 泛型方法未约束类型(如 void F<T&

最低0.47元/天 解锁文章
739

被折叠的 条评论
为什么被折叠?



