前言

在以前的文章中,我们介绍过​​record​​​类型,它具有不变性(《​​为什么应该用record来定义DTO​​​》)和值相等性(《​​为什么应该用record来定义DTO(续)​​》)。

​record​​​是引用类型。而在.NET 6中,我们可以使用​​record struct​​定义值类型。

Demo

1.不变性

定义record structure的代码非常简单,如下所示:

public record struct User(int Id, string Name);

但是,需要注意的是,和​​record​​​不一样,​​record struct​​生成的类型是不具备不变性的:

.NET 6新特性试用 | record struct #yyds干货盘点#_公众号

通过反编译可以看到,最后生成的其实就是​​结构(struct)​​类型,而且每个属性都有set方法:

.NET 6新特性试用 | record struct #yyds干货盘点#_值类型_02

如果要让类型具有不变性,需要在定义时设置readonly关键字:

public readonly record struct User(int Id, string Name);

.NET 6新特性试用 | record struct #yyds干货盘点#_运算符_03

与​​record​​​一样,同样可以用​​with​​表达式修改指定属性创建对象的副本:

.NET 6新特性试用 | record struct #yyds干货盘点#_公众号_04

2.值相等性

因为​​record struct​​实际是一个结构类型,而结构是一种值类型,所以可以使用Equals方法进行值比较,具有有相同值的两个结构将返回true:

public struct User
{
public int Id;
public string Name;
}

.NET 6新特性试用 | record struct #yyds干货盘点#_值类型_05

但是,普通的结构没有实现==和!=运算符,所以不能用这些运算符比较两个结构。但是,可以在​​record struct​​上使用这些运算符进行比较:

.NET 6新特性试用 | record struct #yyds干货盘点#_公众号_06

结论

为了便于区分,可以分别用​​record class​​​和​​record struct​​进行定义:

public record class UserClass(int Id, string Name);
public record struct UserStruct(int Id, string Name);

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

.NET 6新特性试用 | record struct #yyds干货盘点#_运算符_07 My IO ​ 【每日推送】将输入变成输出,每天成长一小步 233篇原创内容 公众号