记录类型的struct与class变体的核心区别及适用场景分别是什么
record struct 与 record class 核心差异及适用场景
核心差异
- 类型本质不同:
record struct属于值类型,默认在栈上分配(嵌套在引用类型中时随宿主在堆分配),实例赋值时会对全量成员做逐值拷贝;record class属于引用类型,所有实例都在堆分配,赋值仅拷贝内存地址,多个变量会指向同一个实例。二者默认都实现了按成员值判断相等的逻辑,但仅record class支持通过ReferenceEquals()判断是否为同一个引用实例。 - 默认不可变性不同:用位置语法声明的
record class,属性默认是init仅初始化修饰的不可变属性;但同语法声明的record struct属性默认是可读可写的,要实现不可变需要额外加readonly关键字声明为readonly record struct。 - 继承能力不同:
record class支持类继承体系,可以继承其他record class,也可以作为基类被派生类继承;record struct作为值类型隐式密封,不支持继承任何自定义类型,仅能实现接口。 - 性能开销不同:小尺寸的
record struct没有堆分配和GC回收开销,访问速度更快;但当成员总尺寸超过16字节时,频繁赋值的全量拷贝开销会快速上升。record class有固定的堆分配、GC开销,但实例赋值仅拷贝8字节(64位系统)的地址,大尺寸实例场景下性能更优。
适用场景
record struct适用场景
- 成员总尺寸小于16字节的小型纯数据载体,比如坐标点、枚举关联的附加数据、接口调用的小型参数包
- 高性能无GC要求的热路径场景,比如游戏帧逻辑、高频交易的中间计算结果、嵌入式设备的业务数据存储
- 不需要继承、不需要共享实例引用的纯值传递场景
record class适用场景
- 成员数量多、总尺寸大的复杂数据载体,比如API响应DTO、业务领域实体快照、日志结构化数据
- 需要使用继承能力扩展的分层数据模型场景
- 需要在多个上下文中共享同一个实例、修改可以同步到所有引用方的场景
- 需要和仅支持引用类型的现有框架、第三方库做适配的场景
内容的提问来源于stack exchange,提问作者Roy Berris
相关产品推荐
相关产品推荐

