Record 是带语义的不可变数据容器启用值相等、init-only 属性、非空保障及自动生成 ToString/Equals/GetHashCode误当普通 class 用易踩坑。Record 类型不是语法糖是带语义的不可变数据容器Record 类型在 C# 9 中不是“更简洁的 class 写法”它默认启用值相等、不可变属性、非空保障和自动生成 ToString/Equals/GetHashCode —— 这些行为是编译器强制注入的不是靠约定或文档提醒。如果你把它当普通 class 用比如手动加 setter、改字段、忽略 init 语义很快会踩坑。record 的属性默认是 init不是 set赋值只能在对象初始化时new Person(A) 或 with 表达式之后再改会编译报错继承 record 时基类字段不会自动参与派生类的相等判断除非显式写进构造参数列表如果 record 包含可变引用类型比如 Liststring它仍是“逻辑可变”的——record 只管自身字段是否被重新赋值不递归冻结内容什么时候该用 record看这三条硬标准别因为“新”就用record 的适用场景非常具体你正在建模一组只读、可比较、可复制的数据载体并且不希望它们被意外修改。典型如 DTO、API 响应结构、配置快照、领域事件载荷。需要结构相等a b 比较内容而非引用→ 用 record只需要引用相等 → 用 class需要安全的副本构造person with { Age 30 }→ 用 record需要复用同一实例或延迟加载 → 不适合字段全部是 init 友好类型string、int、其他 record→ 安全含 Dictionarystring, object 且需随时 Add/Remove → 别硬套加个 class 更直白with 表达式不是深拷贝只是字段级浅复制with 看起来像“复制并修改”但它只复制 record 自身声明的字段对字段内部的可变对象不做任何处理。这是最常被误读的一点。 Tellers AI Tellers是一款自动视频编辑工具可以将文本、文章或故事转换为视频。