结构体是值类型,直接在栈上分配内存;类是引用类型,实例在堆上分配,变量只存指向堆中对象的引用。
内存分配位置决定行为差异
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,避免堆分配和 GC 压力;逻辑复杂、需多态、生命周期长或体积较大(一般超过 16 字节)的对象,必须用 class。
过度使用 struct 反而降低性能:频繁拷贝大结构体比引用传递更耗时 误将 struct 设计得过大或带引用字段,会模糊值语义,增加意外行为风险 跨线程或异步上下文中,struct 的值语义更安全(无共享状态)基本上就这些。栈 vs 堆不是表面概念,它直接决定了你写的每一行赋值、传参、比较代码到底在发生什么。
