前言
在以前的文章中,我们介绍过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生成的类型是不具备不变性的:
通过反编译可以看到,最后生成的其实就是结构(struct)类型,而且每个属性都有set方法:
如果要让类型具有不变性,需要在定义时设置readonly关键字:
public readonly record struct User(int Id, string Name);
与record一样,同样可以用with表达式修改指定属性创建对象的副本:
2.值相等性
因为record struct实际是一个结构类型,而结构是一种值类型,所以可以使用Equals方法进行值比较,具有有相同值的两个结构将返回true:
public struct User
{
public int Id;
public string Name;
}
但是,普通的结构没有实现==和!=运算符,所以不能用这些运算符比较两个结构。但是,可以在record struct上使用这些运算符进行比较:
结论
为了便于区分,可以分别用record class和record struct进行定义:
public record class UserClass(int Id, string Name);
public record struct UserStruct(int Id, string Name);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 xxx@163.com 举报,一经查实,本站将立刻删除。