.NET中的Record类型是什么?编写不可变数据模型的简洁之道

来源:这里教程网 时间:2026-02-21 17:32:39 作者:

.NET 中的 record 类型是一种专为表示不可变数据模型而设计的语言特性,首次在 C# 9.0 中引入。它简化了创建只读数据载体类的过程,让你用更少的代码获得值语义、清晰的结构和内置的行为。

什么是 Record?

Record 是一种引用类型,语法上类似于 class 或 struct,但语义上更侧重于“数据”的本质而非行为。它的核心目标是表达“这个对象包含哪些数据”,而不是“它能做什么”。

定义一个 record 非常简洁:

public record Person(string FirstName, string LastName, int Age);

这一行代码自动为你生成:

一个带有三个参数的构造函数 三个只读属性(getters),其值在构造时设定 基于值的 EqualsGetHashCode 方法(比较内容而非引用) 自动实现的 ToString(),输出格式如:Person { FirstName = John, LastName = Doe, Age = 30 } 支持非破坏性修改的 with 表达式

为什么适合不可变数据模型?

不可变意味着一旦对象被创建,其状态就不能更改。这在函数式编程、并发处理、缓存和数据一致性场景中非常有用。

record 天然支持不可变性:

主构造函数中的属性默认是 get-only,外部无法修改 你可以显式添加私有 set,但推荐保持只读 如果需要“修改”,record 提供 with 表达式创建副本: var person1 = new Person("Alice", "Smith", 25);
var person2 = person1 with { Age = 26 }; // 新实例,其他字段相同

这样既保证了原对象的安全,又实现了数据演进。

与 class 的关键区别

使用 class 实现相同功能需要大量样板代码:

手动写构造函数和属性 重写 Equals、GetHashCode 来实现值比较 自定义 ToString() 显示内容 自己实现 Copy 或 Clone 方法

而 record 自动完成这些,减少出错,提升可读性。

另外,record 支持继承(但不推荐深度使用),也支持自定义方法和额外属性:

public record Employee(string Name, decimal Salary) : Person(Name, "", 0)
{
public bool IsManager => Salary > 10000;
}

适用场景

record 特别适合以下情况:

DTO(数据传输对象):在 API 间传递数据 消息或事件对象:如领域事件、命令 配置或设置类:强调数据组合 函数返回多个值的封装 任何你希望按“值”比较的对象

如果你发现某个类大部分时间都在定义属性和写 Equals,那它很可能更适合定义为 record。

基本上就这些。record 不复杂,但容易忽略它的价值。用它来建模数据,代码会更清晰、更安全、更现代。

相关推荐

热文推荐