C#中的struct和class怎么选 C#值类型与引用类型深度解析

月夜之吻
发布: 2025-12-19 09:12:07
原创
918人浏览过
优先用struct当数据小而简单、需值语义;否则用class。struct适合小(≤16字节)、不可变、无继承需求的值类型;class支持继承、多态、资源管理,更安全灵活。

c#中的struct和class怎么选 c#值类型与引用类型深度解析

struct 还是 class,核心看两点:数据是否小而简单、是否需要值语义。小、不可变、逻辑上像基本类型(比如坐标、颜色、金额)——优先用 struct;其余绝大多数场景,用 class 更安全、更灵活。

struct 适合这些情况

它本质是值类型,分配在上(小对象时),复制是整块拷贝,语义上“等于内容相同”。适合:

  • 数据量小(一般建议 ≤ 16 字节,如 PointDateTimeGuid
  • 逻辑上不可变(推荐只读字段 + init-only 属性,避免意外修改)
  • 不需要继承、多态或复杂生命周期管理
  • 高频创建/销毁且对性能敏感(如数学计算中的向量、矩阵)

⚠️ 注意:如果 struct 成员包含引用类型(如 string 或集合),它仍是值类型,但拷贝时只复制引用,底层对象仍共享——这不是“深拷贝”,别误以为安全隔离了所有数据。

class 是默认且更稳妥的选择

它是引用类型,分配在堆上,变量存的是引用。天然支持继承、虚方法、接口实现、析构逻辑等。适合:

  • 数据较复杂或体积较大(避免栈溢出和无谓拷贝)
  • 需要多态行为(如不同形状的 Draw() 实现)
  • 对象需被多个地方共享并协同修改(如订单、用户会话)
  • 需要懒加载、事件、资源管理(IDisposable)等高级能力

即使你定义了一个“看起来很轻”的 class,只要它未来可能扩展功能,也比后期把 struct 改成 class 安全得多——因为 struct 的值语义一旦暴露给外部,改 class 会破坏行为(比如传参从拷贝变成传引用)。

Dream Machine
Dream Machine

Dream Machine 是由 Luma AI 开发的一款 AI 视频生成工具,可以快速将文本和图像转换为高质量的视频内容。

Dream Machine 165
查看详情 Dream Machine

容易踩坑的细节

不是所有“小”都该用 struct。比如:

  • struct 赋值、传参、返回都会触发完整拷贝——如果内部有 100 个字段,性能反而差
  • struct 继承自 System.ValueType,但不能显式继承其他类型,也不能作为基类被继承
  • 装箱(boxing)会让 struct 上堆,一次装箱就失去值类型优势,还可能引发 GC 压力(如循环中把 struct 加入 List<object></object>
  • 默认构造函数不能重写,字段必须全部初始化(C# 10+ 支持 parameterless constructor,但仍有约束)

一个实用判断流程

写新类型前,快速问自己:

  • 它的实例通常有多大?(字段总大小
  • 它代表一个“值”还是一个“东西”?(Money 是值,BankAccount 是东西)
  • 会不会需要子类化或依赖多态?
  • 有没有非托管资源要释放?(struct 不支持析构函数,IDisposable 实现也受限)
  • 团队是否容易理解并正确使用它的值语义?(误用常源于认知偏差)

基本上就这些。不复杂,但容易忽略。

以上就是C#中的struct和class怎么选 C#值类型与引用类型深度解析的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号