C# 结构体(struct)和类(class)的本质区别 - 栈内存与堆内存的分配

来源:这里教程网 时间:2026-02-21 17:37:33 作者:

结构体是值类型,直接在栈上分配内存;类是引用类型,实例在堆上分配,变量只存指向堆中对象的引用。

内存分配位置决定行为差异

struct 实例(如 Point p = new Point(1, 2);)整个数据(比如两个 int 字段)就放在栈里,复制时是整块拷贝;class 实例(如 Person person = new Person();)实际对象存在堆中,栈上只存一个 4 或 8 字节的引用(指针),赋值或传参只是复制这个引用,不复制对象本身。

赋值和参数传递表现不同

struct 赋值是深拷贝:修改副本不影响原值;class 赋值是浅拷贝引用:两个变量指向同一块堆内存,改其中一个会影响另一个。

struct 示例:var a = new Point(10, 20); var b = a; b.X = 100; // a.X 仍是 10 class 示例:var x = new Person { Name = "Alice" }; var y = x; y.Name = "Bob"; // x.Name 变成 "Bob"

默认构造与可空性限制

struct 总有隐式无参构造,不能显式定义无参构造函数,且不能为 null(除非用 NullableT?);class 可以定义任意构造函数,变量默认为 null,支持继承和多态。

struct 不能继承其他 struct 或 class(但可实现接口) class 支持继承、虚方法、抽象、密封等面向对象特性 struct 实例字段不能在声明时直接初始化(C# 10+ 允许 init-only 成员,但仍有约束)

性能与使用场景建议

小而简单的数据载体(如坐标、颜色、金额)优先用 struct,避免堆分配和 GC 压力;逻辑复杂、需多态、生命周期长或体积较大(一般超过 16 字节)的对象,必须用 class。

过度使用 struct 反而降低性能:频繁拷贝大结构体比引用传递更耗时 误将 struct 设计得过大或带引用字段,会模糊值语义,增加意外行为风险 跨线程或异步上下文中,struct 的值语义更安全(无共享状态)

基本上就这些。栈 vs 堆不是表面概念,它直接决定了你写的每一行赋值、传参、比较代码到底在发生什么。

相关推荐