C#Record构造函数的行为更改详解
简介
在 C# 9.0 中,引入了一个新的语言特性:Record 类型。Record 类型是一种不可变的、轻量级的对象类型,它能够快速和方便地创建、比较和复制对象。特别是,Record 类型支持自动生成“自定义等值比较”、“GetHashCode() 方法”、“ToString() 方法”和“复制构造函数”。这些功能不再需要我们手动实现,从而减少了我们的编码时间。
由于 Record 类型是不可变的,所以在初始化时,可以使用构造函数来提供初始值。然而,在 C# 9.0 以前的版本中,Record 类型的构造函数是有一些限制的。特别是,构造函数只能够初始化对象的属性。
在 C# 9.0 中,这个限制得到了打破。Record 类型的构造函数不再限制只能初始化属性。我们可以将一些额外的代码添加到构造函数中,以支持更高级别的初始化需求。这个行为变化可以让 Record 类型变得更加灵活和强大。
在本篇攻略中,我们将详细讲解 C#Record构造函数的行为更改,并提供一些示例来解释这些更改。
详解
原来的行为
在 C# 9.0 以前的版本中,Record 类型的构造函数只能初始化对象的属性。例如,下面这个 StudentRecord 类型:
public record StudentRecord(string Name, int Age);
其构造函数只能初始化 Name 和 Age 两个属性。
var student = new StudentRecord("Tom", 18); // 构造函数只能初始化 Name 和 Age 两个属性
现在的行为
在 C# 9.0 中,Record 类型的构造函数不再限制只能初始化属性,我们可以将一些额外的代码添加到构造函数中,以支持更高级别的初始化需求。
下面这个示例,展示了如何在 Record 类型的构造函数中添加一些额外的代码来支持更高级别的初始化需求。
public record EmployeeRecord(string Name, int Age)
{
public EmployeeRecord(string name, int age) : this(name, age)
{
Console.WriteLine($"Creating employee record for {name}...");
// 某些额外的初始化代码...
}
}
var employee = new EmployeeRecord("Tom", 18);
// 输出:Creating employee record for Tom...
在这个示例中,我们定义了一个 EmployeeRecord 类型,并添加了一个额外的构造函数。在构造函数中,我们首先调用基础构造函数,然后添加了一些额外的代码来支持更高级别的初始化需求。当我们创建 EmployeeRecord 对象时,构造函数会执行,输出 "Creating employee record for Tom...",并且执行其他的额外初始化代码。
再例
下面再举一个例子,这个示例展示了如何在 Record 类型中使用表达式体构造函数来支持更高级别的初始化需求。
public record CarRecord(string Model, int Year)
{
private readonly int _id;
public CarRecord(string model, int year) => (_id, Model, Year) = (new Random().Next(), model, year);
}
var car = new CarRecord("Tesla Model S", 2021);
Console.WriteLine($"Car ID: {car._id}, Model: {car.Model}, Year: {car.Year}");
// 输出:Car ID: 651211748, Model: Tesla Model S, Year: 2021
在这个示例中,我们定义了一个 CarRecord 类型,并添加了一个构造函数。在构造函数中,我们使用表达式体构造函数来初始化 _id、Model 和 Year 属性,其中 _id 属性是只读的,且只在构造函数中设置。
当我们创建 CarRecord 对象时,构造函数会执行,随机生成 _id 属性的值,并初始化 Model 和 Year 属性。最后,我们输出 CarRecord 对象的属性值,可以看到 _id 属性已经生成了新的随机值。
总结
在 C# 9.0 中,Record 类型的构造函数的行为得到了改进。现在,我们可以在 Record 类型的构造函数中添加额外的代码来支持更高级别的初始化需求。特别是,在 Record 类型的构造函数中,我们可以使用表达式体构造函数、链式构造函数、构造函数重载等方式来替代之前的初始化属性的方式,从而让 Record 类型的使用更加灵活和强大。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# Record构造函数的行为更改详解 - Python技术站