C#中的结构体(struct)和类(class)有什么区别 C# struct与class的选择

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

在C#中,structclass 都是用来封装数据和行为的类型,但它们在本质上有重要区别,直接影响性能、内存使用和编程逻辑。选择哪一个,取决于具体场景。

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 或性能问题。

相关推荐