struct是值类型,赋值复制数据,适合小对象;class是引用类型,赋值复制引用,支持继承多态,适用于复杂对象。

在C#中,struct 和 class 都是用来封装数据和行为的类型,但它们在本质上有重要区别,直接影响性能、内存使用和编程逻辑。选择哪一个,取决于具体场景。
1. 值类型 vs 引用类型
struct 是值类型,而 class 是引用类型,这是最根本的区别。
- 值类型的数据直接存储在栈上(或内联在包含它的对象中),赋值时会复制整个数据。
- 引用类型的变量保存的是指向堆上对象的引用,赋值只是复制引用,不复制实际数据。
例如:
struct PointStruct { public int X, Y; }
class PointClass { public int X, Y; }
var s1 = new PointStruct { X = 1 };
var s2 = s1;
s2.X = 2;
// s1.X 仍是 1
var c1 = new PointClass { X = 1 };
var c2 = c1;
c2.X = 2;
// c1.X 变成 2,因为 c1 和 c2 指向同一个对象
2. 内存分配与性能
struct 分配在栈上(局部变量)或内联在对象中,避免了堆分配和垃圾回收开销,适合小数据结构。
- 频繁创建和销毁的小对象使用 struct 可减少 GC 压力。
- 但如果 struct 较大,复制成本高,反而影响性能。
class 分配在堆上,由 GC 管理,适用于生命周期长或需要共享的对象。
3. 继承与多态支持
class 支持继承和多态,可以派生子类,重写虚方法。
- struct 不能被继承,也不能声明为 abstract 或 sealed(隐式 sealed)。
- struct 只能实现接口,但不能有虚方法或重写机制。
如果你需要面向对象设计中的继承体系,必须使用 class。
4. 默认构造函数与字段初始化
struct 不能声明无参构造函数,编译器自动提供一个默认构造函数,将所有字段初始化为默认值。
- 你可以定义带参数的构造函数,但不能省略字段赋值。
- class 可以自定义无参构造函数,并控制初始化逻辑。
另外,struct 中的字段不能在声明时直接赋值(除非是 const 或 static),而 class 可以。
5. null 值与可空性
struct 是值类型,不能为 null(除非使用 Nullable
- class 类型的变量天然可以为 null。
- 如果需要表示“无值”状态,class 更自然,但 struct 也可通过 int? 这样的方式支持。
何时选择 struct,何时选择 class?
微软建议:如果满足以下所有条件,考虑使用 struct:
- 实例较小且生命周期短。
- 逻辑上代表一个简单的数据结构(如坐标、颜色、矩形)。
- 不会被频繁修改或传递(避免复制开销)。
- 不需要继承或多态。
- 不常装箱(boxing)到 object 或接口。
常见 struct 示例:int、double、DateTime、System.Numerics.Vector3、自定义的 Size、Color 等。
大多数业务对象、服务、控制器、复杂状态管理都应使用 class。
基本上就这些。关键不是语法差异,而是语义和性能权衡。用对了提升效率,用错了可能引发隐藏 bug 或性能问题。









