1. 引言
在C# 9中,引入了一个新的语言特性——record(记录),它的目标是提供一种更简洁、更易用的方式来定义和操作不可变数据。本文将对C# 9中record的相关特性进行总结和分析。
2. record的基本概念
record是一种特殊的类,它的实例是不可变的,也就是说,一旦创建了record的实例,就无法修改它的属性。相比于传统的类,record提供了更简洁的写法和更方便的功能。
2.1 声明record
在C# 9中,声明record非常简单,只需使用record
关键字:
record Person
{
public string Name { get; init; }
public int Age { get; init; }
}
上面的代码就定义了一个名为Person的record,它有两个属性:Name和Age。这两个属性都是只读的,且只能在构造函数中进行初始化。一旦构造了Person的实例,就无法修改它的属性。
2.2 record的相等性判断
在C# 9中,我们可以使用record来进行相等性判断。两个record实例只有在其属性值都相等的情况下才被认为是相等的。
Person person1 = new Person { Name = "Tom", Age = 20 };
Person person2 = new Person { Name = "Tom", Age = 20 };
Console.WriteLine(person1 == person2); // 输出:True
上面的代码中,person1和person2是两个不同的record实例,但它们的属性值都相等,所以它们被认为是相等的。
3. record的高级特性
3.1 with表达式
在C# 9中,我们可以使用with表达式来创建一个新的record实例,并同时修改其中的某些属性值:
Person person1 = new Person { Name = "Tom", Age = 20 };
Person person2 = person1 with { Age = 30 };
Console.WriteLine(person2.Name); // 输出:Tom
Console.WriteLine(person2.Age); // 输出:30
上面的代码中,我们首先创建了一个名为person1的record实例。然后,使用with表达式创建了一个新的record实例person2,同时将person1的Age属性修改为30。
3.2 record的拷贝
通过with表达式,我们可以很方便地实现record的拷贝:
Person person1 = new Person { Name = "Tom", Age = 20 };
Person person2 = person1;
Console.WriteLine(person1 == person2); // 输出:True
person2 = person2 with { Name = "Jerry" };
Console.WriteLine(person1.Name); // 输出:Tom
Console.WriteLine(person2.Name); // 输出:Jerry
上面的代码中,我们首先将person1赋值给person2,然后使用with表达式修改了person2的Name属性。这时,person1和person2是两个不同的record实例,它们的Name属性不相等。
3.3 position属性
在C# 9中,我们可以使用position属性来为record的属性赋值。position属性是一个简化属性的写法,它可以自动为每个属性生成一个位置参数:
record Person(string Name, int Age);
Person person = new("Tom", 20);
Console.WriteLine(person.Name); // 输出:Tom
Console.WriteLine(person.Age); // 输出:20
上面的代码中,Person类的两个属性Name和Age都是position属性,它们的值可以通过构造函数来传入。
3.4 init属性
在C# 9中,我们可以使用init属性来为record的属性进行初始化:
record Person
{
public string Name { get; init; }
public int Age { get; init; }
}
Person person = new Person { Name = "Tom", Age = 20 };
person.Name = "Jerry"; // 编译错误
上面的代码中,Person类的Name和Age属性都是init属性,它们只能在构造函数中进行初始化,不能在其他地方对其进行赋值。
4. 总结
本文总结了C# 9中record的相关特性,包括声明record、record的相等性判断、with表达式、record的拷贝、position属性和init属性。record提供了一种更简洁、更易用的方式来定义和操作不可变数据,能够极大地提高代码的可读性和开发效率。在实际的开发中,我们可以根据具体的需求来选择是否使用record。