0

0

c# 记录 record 类型有什么好处

畫卷琴夢

畫卷琴夢

发布时间:2025-12-30 11:17:32

|

269人浏览过

|

来源于php中文网

原创

record类型自动提供不可变性、值相等、安全克隆和可读字符串表示,省去90% DTO/VO样板代码;它通过init属性、with表达式、自动Equals/GetHashCode/ToString解决class手动实现的繁琐与安全隐患。

c# 记录 record 类型有什么好处

record 类型最直接的好处是:用一行声明自动获得不可变性、值相等、安全克隆和可读字符串表示——省掉 90% 的 DTO/VO 样板代码。

为什么不用 class 写 DTO?

手动写 class 实现数据传输对象时,你得反复处理:get; init; 属性、构造函数、EqualsGetHashCodeToString,甚至还要考虑线程安全。稍不注意就写出可变对象,在并发或 API 层埋下隐患。

  • 改一个属性可能意外影响其他模块(比如被某个 foreach 循环中的引用悄悄修改)
  • 两个相同内容的 class 实例用 == 比较返回 false,但业务上它们就是“相等”的
  • 想复制并改一个字段?得手写 Clone() 或深拷贝逻辑,容易漏字段或出错

record 怎么解决这些痛点?

它不是语法糖,而是编译器级契约:一旦声明为 record,你就默认获得四项关键能力。

  • init 属性强制只在初始化阶段赋值(包括 newwith 表达式),运行时修改直接报错:Init-only property or indexer 'X.Y' can only be assigned in an object initializer...
  • 两个 record 实例只要所有公开属性值相同,==.Equals().GetHashCode() 全部自动对齐——无需重写
  • with 表达式提供非破坏性更新:var p2 = p1 with { Age = 31 };,生成新实例,原对象毫发无损
  • ToString() 输出结构化文本:Person { Name = "Alice", Age = 30 },调试时一眼看清状态

哪些场景必须优先用 record?

不是所有类都适合 record,但它在以下场景几乎无替代方案:

Studio Global
Studio Global

Studio Global AI 是一个内容生成工具,帮助用户客制化生成风格和内容,以合理价格提供无限生成,希望将 AI 带给全世界所有人。

下载
  • Web API 的请求/响应模型(DTO):避免反序列化后被意外修改,也防止前端传参污染服务端状态
  • 领域驱动设计中的值对象(Value Object):如 MoneyAddressRange,语义上“值相同即相等”
  • 并发计算中的中间数据:比如 LINQ 查询链、Actor 模型消息体、函数式风格管道处理,天然线程安全
  • 配置快照或日志事件结构:记录某一时刻的状态,绝不允许事后篡改

容易忽略的坑和限制

record 看似简单,但几个边界问题常被低估:

  • 继承只能在 record 之间进行:public record Animal : Person ✅,但 public record Dog : SomeClass ❌ 编译失败
  • 位置记录(public record Person(string Name, int Age))会自动生成 Deconstruct 方法,但如果你手动加了 private set 属性,它不会参与 Equals 计算——这点和 init 属性不同
  • record 是引用类型,不是 struct;它不触发分配,也不带值类型的内存拷贝开销,但也不能用 ref 参数做原地修改
  • 如果真需要部分可变(比如缓存字段),可以用 private readonly 字段 + 公开 init 属性组合,但要清楚这已偏离纯 record 语义

真正难的不是写 record,而是判断什么时候不该用它——比如需要生命周期管理、事件通知、延迟加载或复杂验证逻辑的对象,还是老实用 class 更合适。别为了“简洁”牺牲语义清晰度。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

37

2025.12.04

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

247

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1434

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

608

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

546

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

539

2024.04.29

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 7.6万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.1万人学习

Vue 教程
Vue 教程

共42课时 | 5.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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