C# 9 新特性——record的相关总结

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。

后端开发标签