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

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

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

在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 仍是 1var 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 或性能问题。

以上就是C#中的结构体(struct)和类(class)有什么区别 C# struct与class的选择的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1441267.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 17:54:48
下一篇 2025年12月17日 17:55:00

相关推荐

发表回复

登录后才能评论
关注微信