在 C# 中,值类型(如结构体)和引用类型在内存中的布局方式有哪些关键差异?请从存储位置、分配方式、传递行为等方面说明。
考察说明
考查对 C# 值类型与引用类型内存布局及行为差异的理解。
回答思路
- 【回答框架 1】值类型(如结构体)直接包含数据,存储在栈上或作为其他对象的一部分内联存储;引用类型存储的是指向堆上对象的引用,对象本身在堆上分配。
- 【回答框架 2】值类型赋值时复制整个数据,两个变量独立;引用类型赋值时复制引用,两个变量指向同一对象,修改一个会影响另一个。
- 【回答框架 3】值类型默认按值传递,方法内修改不影响原变量;引用类型按引用传递,方法内修改会影响原对象。
- 【回答框架 4】值类型适合小且不可变的数据,如坐标、颜色;引用类型适合大对象或需要共享状态的数据。
- 【回答框架 5】值类型有装箱和拆箱操作,装箱将值类型转换为 object 或接口类型,分配在堆上,有性能开销;拆箱则相反。
- 【关键点 1】值类型存储在栈或内联,引用类型存储在堆。
- 【关键点 2】值类型赋值复制数据,引用类型赋值复制引用。
- 【关键点 3】值类型按值传递,引用类型按引用传递。
- 【关键点 4】装箱拆箱带来额外性能开销。
- 【易错点 1】误认为所有值类型都在栈上,实际可能内联在堆对象中。
- 【易错点 2】忽略引用类型修改的副作用,导致意外共享状态。
- 【易错点 3】频繁装箱拆箱导致性能下降。