C# 中的 record类型详解

💡 原文中文,约2100字,阅读约需5分钟。
📝

内容提要

C# 9.0 引入了 record 类型,提供简洁的不可变数据模型,支持值比较,适合用于数据传输对象和值对象。与传统类相比,record 自动生成构造函数、属性和比较方法。C# 10 还支持值类型的 record struct,简化模型定义和表示不可变状态。

🎯

关键要点

  • C# 9.0 引入了 record 类型,提供简洁的不可变数据模型。

  • record 类型支持值比较,适合用于值对象。

  • record 是引用类型,默认不可变,支持值比较。

  • record 自动生成构造函数、属性、比较方法和 ToString 方法。

  • record 的属性使用 init 访问器,表示只能在对象初始化时赋值。

  • record 重写了 Equals 和 GetHashCode 方法,比较内容而非引用地址。

  • 使用 with 表达式可以创建对象的副本并修改部分属性。

  • C# 10 支持 record struct,作为值类型的不可变数据模型。

  • record class 是引用类型,record struct 是值类型,且可以声明为 readonly。

  • record 适用于数据传输对象、值对象建模、不可变状态表示和简化模型定义。

  • record 支持继承和模式匹配,增强了功能。

🔎

延伸解读

record类型的优势

C#中的record类型提供了不可变性和值比较的特性,使得数据模型更加安全和简洁。与传统类相比,record自动生成构造函数和比较方法,减少了样板代码,提高了开发效率。

使用场景与适用性

record类型特别适合用于数据传输对象(DTO)和值对象(VO)的建模。它的不可变性和简化的语法使得在状态管理(如Redux)中更易于维护和理解。

record与class的比较

record类型与传统class的主要区别在于比较方式和可变性。record默认使用值比较,而class则是引用比较,这使得record在处理数据时更具语义明确性。

延伸问答

C# 中的 record 类型有什么特点?

record 类型是引用类型,默认不可变,支持值比较,自动生成构造函数、属性和比较方法。

如何使用 with 表达式创建 record 对象的副本?

可以使用 with 表达式创建对象的副本并修改部分属性,例如:var p3 = p1 with { LastName = '四' };

C# 10 中 record struct 的特点是什么?

record struct 是值类型,可以声明为 readonly,保证不可变性。

record 类型适合用于哪些场景?

record 类型适合用于数据传输对象、值对象建模、不可变状态表示和简化模型定义。

record 类型如何实现值比较?

record 类型重写了 Equals 和 GetHashCode 方法,比较的是内容而不是引用地址。

record 类型与传统类有什么区别?

record 类型默认不可变,支持值比较,而传统类是可变的,默认使用引用比较。

🏷️

标签

➡️

继续阅读