新闻中心

C#的record struct是什么?它与record class有什么区别?

2025-11-11
浏览次数:
返回列表
record struct是C# 10引入的值类型数据载体,结合struct性能与record语义,适用于高频创建的小对象;其为栈分配、默认只读、按值比较且支持with表达式(C# 12起),而record class为堆分配引用类型,适合需共享或继承的场景,两者核心差异在于内存模型、赋值行为与使用语义。

c#的record struct是什么?它与record class有什么区别?

record struct 是 C# 10 引入的一种值类型,用于定义不可变的、轻量级的数据载体。它结合了 struct 的性能优势(栈分配、无垃圾回收压力)和 record 的语义特性(如值相等性、with 表达式支持等)。与传统的 record class 相比,它们在类型本质、内存行为和使用场景上有明显差异。

record struct 的特点

record struct 是基于值类型的 record,适用于需要高性能和低内存开销的场景:

  • 它是值类型,存储在栈上(通常),避免堆分配
  • 默认字段是 readonly,确保不可变性
  • 支持基于值的相等性比较(两个实例字段相同即视为相等)
  • 支持 with 表达式(C# 12 起对 readonly record struct 支持)
  • 可以声明位置参数,编译器自动生成构造函数和属性

示例:

public readonly record struct Person(string Name, int Age);

record class 的特点

record class 是引用类型,更接近传统面向对象的设计:

千鹿Pr助手 千鹿Pr助手

智能Pr插件,融入众多AI功能和海量素材

千鹿Pr助手 128 查看详情 千鹿Pr助手
  • 它是引用类型,实例分配在堆上,由 GC 管理
  • 默认也是不可变的(通过 init-only 属性)
  • 同样支持值语义的相等性判断(比较字段内容而非引用)
  • 天然支持 with 表达式创建副本
  • 可继承(但 record 之间继承有限制)

示例:

public record class Person(string Name, int Age);

主要区别对比

  • 内存模型不同:struct 存在栈或内联在其他对象中,class 在堆上分配
  • 赋值行为不同:record struct 赋值时复制整个数据,record class 只复制引用
  • 相等性实现方式:两者都按字段比较,但 struct 不涉及 null 判断,class 需处理引用为 null 的情况
  • 性能特征:record struct 更适合高频创建的小对象,避免 GC 压力;record class 更适合生命周期长或需多处共享的对象
  • 可变性控制:record struct 推荐标记为 readonly,防止装箱导致的可变问题;record class 天然隔离

使用建议

  • 如果数据小(比如少于 16 字节)、频繁创建/销毁,优先考虑 record struct
  • 需要引用语义(如多个地方共享同一实例)时用 record class
  • 担心装箱性能或意外修改时,将 record struct 声明为 readonly
  • 需要继承或与其他类集成时,record class 更合适

基本上就这些。选择哪种取决于你对性能、内存和语义的需求。record struct 更“轻”,record class 更“通用”。

以上就是C#的record struct是什么?它与record class有什么区别?的详细内容,更多请关注其它相关文章!


# 怎么处理  # 房地产网站建设总部  # 创业垂直网站怎么做推广  # 建设网站需要什么栏目  # 网站seo权重  # 绍兴网站建设怎样  # 葫芦岛seo优化推广  # 湖南网站建设程序  # 网站推广统计图怎么做好  # 郑州做网站优化电话  # 开封智能营销推广招商  # 有什么  # 字节  # 如何实现  # 有什么区别  # 更适合  # 如何使用  # 它是  # 适用于  # 面向对象  # 它与  # c#  # 区别  #  


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 智慧团建扫码登录入口 智慧团建扫码登录入口官网版​  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  菜鸟取件码是什么怎么查 最全查询渠道汇总  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  韩剧圈正版入口页面_韩剧圈官网登录链接  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  J*aScript中赋值与自增运算符的复杂交互与执行机制  b站怎么取消点赞_b站点赞取消操作方法  必由学网页版入口 必由学官方平台直接访问  必由学官方网站入口 必由学学生教师共用登录通道  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  如何使用Node.js csv 包按条件移除含空字段的CSV记录  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  jQuery Mask 插件中实现电话号码固定前导零的教程  Golang如何实现状态模式管理对象状态_Golang State模式实现技巧  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  J*aScript map 方法中处理循环元素为空数组的策略  妖精动漫免费平台 妖精动漫官网资源观看网址  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  qq游戏免费畅玩入口_qq游戏电脑版快速启动  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  C#中解析不规范的HTML为XML 常见的坑与解决办法  2026春节假期票务安排_2026春节放假购票指南  qq游戏跨平台入口_qq游戏多设备同步登录  可靠CSGO开箱平台解析 CSGO开箱网合集  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  AO3同人作品网入口 AO3搜索引擎官网永久地址  Win11怎么开启省电模式_Win11电池节电模式自动开启  圆通快递查询实时追踪 圆通物流包裹状态快速查看  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  修复二维数组索引越界异常:一维循环到二维坐标的正确映射  动漫花园资源网使用步骤_动漫花园资源网下载流程  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  Go Martini框架:动态服务解码后的图片内容  魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】  Mac怎么查看崩溃日志_Mac控制台错误报告分析  抖音极速版最新版本 抖音极速版官方下载地址  优化HTML表单样式:解决输入框焦点跳动与元素间距问题 

搜索