c# Record关键字
在 C# 9.0 中引入了 record
关键字,用于定义记录类型(Record Types)。记录类型是一种轻量级的数据载体,专注于表示数据,它提供了内置的相等性比较、生成属性和方法等功能,使得编写数据类更加简洁和高效。
基本概念
- 不可变性:记录类型默认是不可变的,这意味着它们的属性是只读的,不能被修改。
- 相等性:记录类型根据其值进行相等比较,而不是引用比较。
- 自动化成员:记录类型可以自动生成构造函数、属性、
ToString
、Equals
和GetHashCode
方法。
声明记录类型
记录类型的声明非常简洁,基本语法如下:
public record Person(string FirstName, string LastName, int Age);
这会生成一个包含 FirstName
、LastName
和 Age
属性的记录类型,并自动提供构造函数、ToString
、Equals
和 GetHashCode
方法。
不可变性和可变性
- 不可变记录:默认情况下,记录类型是不可变的,属性是只读的。例如:
public record Person(string FirstName, string LastName, int Age);
- 可变记录:可以通过在记录类型后添加
with
关键字来创建可变记录,允许修改属性。例如:
public record Person(string FirstName, string LastName, int Age) with;
构造函数和初始化
记录类型自动生成构造函数,可以直接通过属性初始化:
var person = new Person("John", "Doe", 30);
相等性比较
记录类型根据值进行相等比较:
var person1 = new Person("John", "Doe", 30);
var person2 = new Person("John", "Doe", 30);
Console.WriteLine(person1 == person2); // 输出: True
自定义方法和成员
可以在记录类型中添加自定义方法和成员:
public record Person(string FirstName, string LastName, int Age)
{
public string FullName => $"{FirstName} {LastName}";
}
属性访问器
默认情况下,记录类型的属性是只读的。如果需要自定义属性行为,可以显式定义属性:
public record Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
public int Age { get; init; }
}
使用 init
访问器可以在初始化对象时设置值,但之后不能修改。
继承和派生
记录类型可以继承其他记录类型,派生记录类型会继承基记录类型的属性和方法。
public record Person(string FirstName, string LastName, int Age);
public record Employee(string FirstName, string LastName, int Age, string EmployeeId) : Person(FirstName, LastName, Age);
使用场景
- 数据传输对象(DTO):记录类型非常适合用来表示数据传输对象,因为它们专注于数据的表示和传输。
- 不可变数据结构:在需要不可变数据的情况下,记录类型提供了方便的不可变性支持。
- 配置对象:记录类型可以用来表示应用程序的配置选项,因为它们易于创建和比较。
示例代码
public record Person(string FirstName, string LastName, int Age)
{
public string FullName => $"{FirstName} {LastName}";
}
class Program
{
static void Main()
{
var person1 = new Person("John", "Doe", 30);
var person2 = new Person("John", "Doe", 30);
var person3 = new Person("Jane", "Doe", 25);
Console.WriteLine(person1 == person2); // True
Console.WriteLine(person1 == person3); // False
Console.WriteLine(person1.FullName); // John Doe
}
}