记录(Record)是C# 9.0引入的一种新的类型,它提供了一种创建不可变类型的简便方式,并且具有一些内置的行为,比如值相等性比较、非破坏性变化以及支持继承等特性。以下是关于.NET Core中记录(Record)的详细介绍:
什么是记录(Record)
记录是一个修饰符,用于定义一个引用类型,它提供了封装数据的内置功能,并且支持不可变的数据模型。在C# 10中,record
可以与class
一起使用来明确表示引用类型,也可以使用record struct
来定义值类型[^4^]。
定义一个记录
使用record
(或record class
)可以定义引用类型,而record struct
则用于定义值类型。记录的主构造函数参数称为位置参数,编译器会为这些参数生成公共属性。例如:
public record Person(string Name, string Address, int Age);
此外,记录也可以创建为可变类型,具有可变属性和字段:
public record Person
{
public required string FirstName {
get; set; }
public required string LastName {
get; set; }
};
记录类型提供的功能
- 不可变性:记录默认是不可变的,这有助于创建线程安全的类型,并且可以保持哈希码不变。
- 值相等性:记录类型重写了
Equals
方法和GetHashCode
方法,以支持基于值的相等性比较。 - 非破坏性变化:使用
with
表达式可以创建记录的副本并修改其属性,而不必改变原始对象。 - 继承:记录支持继承,可以创建更具体的记录类型。
- 内置格式化:记录类型重写了
ToString
方法,提供了一种内置的方式来格式化记录的字符串表示。
引用类型记录和值类型记录的区别
- 使用
record
或record class
声明的是引用类型,而record struct
声明的是值类型。 - 在
record
和readonly record struct
中,属性是不可变的(使用init
访问器),而在record struct
中,属性是可变的(使用get
和set
访问器)。
Record常用属性
- 位置语法:在创建记录实例时,可以使用位置参数来声明和初始化属性。
- 不可变性:
positional record
和positional readonly record struct
声明了init-only
属性,而positional record struct
声明了可读写属性。 - 值相等性:记录类型自动实现了基于值的相等性比较。
- 非破坏性变化:通过
with
表达式可以实现非破坏性变化。 - 继承:记录支持继承,可以创建层次结构。