当前位置:首页 > C# > 正文

C# 9.0 记录类型详解(副标题:轻松掌握 record 实现不可变数据结构)

在 C# 9.0 中,微软引入了一种全新的类型——记录类型(record)。它专为表示不可变数据而设计,让开发者可以更简洁、安全地处理数据对象。本教程将从零开始,带你一步步了解 record 的基本语法、优势以及实际应用场景,即使是编程小白也能轻松上手!

C# 9.0 记录类型详解(副标题:轻松掌握 record 实现不可变数据结构) 记录类型 不可变数据 第1张

什么是记录类型(record)?

传统的 C# 类(class)通常用于封装行为和状态,但当我们只需要一个“数据容器”时,写一堆属性、构造函数、Equals/GetHashCode 方法会显得冗长。而 record 就是为解决这个问题而生的。

使用 record,你可以用一行代码定义一个具有值语义(value-based equality)的不可变类型。

基本语法示例

下面是一个最简单的 record 定义:

public record Person(string FirstName, string LastName);

这行代码等价于以下传统类的完整实现:

public class Person{    public string FirstName { get; init; }    public string LastName { get; init; }    public Person(string firstName, string lastName)    {        FirstName = firstName;        LastName = lastName;    }    public override bool Equals(object? obj) => obj is Person p &&        FirstName == p.FirstName &&        LastName == p.LastName;    public override int GetHashCode() => HashCode.Combine(FirstName, LastName);    public override string ToString() => $"Person {{ FirstName = {FirstName}, LastName = {LastName} }}";}

可以看到,record 自动为你生成了:

  • 只读属性(使用 init
  • 主构造函数
  • 基于值的 EqualsGetHashCode
  • 友好的 ToString() 输出

不可变性与 with 表达式

由于 record 默认是不可变的(属性只能在初始化时赋值),C# 提供了 with 表达式来创建修改后的新实例,而不改变原对象:

var person1 = new Person("张", "三");var person2 = person1 with { FirstName = "李" };Console.WriteLine(person1); // Person { FirstName = 张, LastName = 三 }Console.WriteLine(person2); // Person { FirstName = 李, LastName = 三 }

这种模式非常适合函数式编程风格,也避免了意外修改共享数据的风险。

record 与 class 的区别

| 特性 | class | record ||------|------------------|------------------|| 默认可变性 | 可变 | 不可变(属性为 init) || 相等性比较 | 引用相等 | 值相等 || 自动生成方法 | 否 | 是(Equals, GetHashCode, ToString) || 支持 with 表达式 | 否 | 是 |

何时使用 record?

当你需要表示不可变数据、DTO(数据传输对象)、配置项、消息体等场景时,record 是理想选择。它让代码更简洁、更安全,也更符合现代 C# 的开发理念。

总结

C# 9.0 的 record 类型极大地简化了不可变数据结构的定义。通过位置参数、自动生成的方法以及 with 表达式,开发者可以写出更少、更清晰、更可靠的代码。无论你是刚接触 C# 的新手,还是经验丰富的老手,掌握 record 都将提升你的编码效率。

关键词回顾:C# 9.0记录类型record不可变数据