结构体是值类型,分配在栈上,赋值时深拷贝数据,修改副本不影响原值;类是引用类型,实例在堆上,栈中存引用,赋值为浅拷贝,多个变量指向同一对象,修改相互影响。struct 不能继承、无默认构造函数、字段不可直接初始化(C#10前),且不支持null;class 支持继承、多态、构造函数及null赋值。小数据用 struct 提升性能,避免GC;复杂逻辑或大数据用 class。频繁复制大 struct 反而降低效率,且含引用字段易引发意外行为。栈与堆的差异直接影响赋值、传参和比较操作的行为本质。

结构体是值类型,直接在栈上分配内存;类是引用类型,实例在堆上分配,变量只存指向堆中对象的引用。
内存分配位置决定行为差异
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(除非用 Nullable
- struct 不能继承其他 struct 或 class(但可实现接口)
- class 支持继承、虚方法、抽象、密封等面向对象特性
- struct 实例字段不能在声明时直接初始化(C# 10+ 允许 init-only 成员,但仍有约束)
性能与使用场景建议
小而简单的数据载体(如坐标、颜色、金额)优先用 struct,避免堆分配和 GC 压力;逻辑复杂、需多态、生命周期长或体积较大(一般超过 16 字节)的对象,必须用 class。
- 过度使用 struct 反而降低性能:频繁拷贝大结构体比引用传递更耗时
- 误将 struct 设计得过大或带引用字段,会模糊值语义,增加意外行为风险
- 跨线程或异步上下文中,struct 的值语义更安全(无共享状态)
基本上就这些。栈 vs 堆不是表面概念,它直接决定了你写的每一行赋值、传参、比较代码到底在发生什么。










