.NET 6新特性试用 | record struct

前言

在以前的文章中,我们介绍过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生成的类型是不具备不变性的:

4b09280bae1e87889cf3fe29a102ce12.png

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

e1c043ebfb2b938114a7c7919387024c.png

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

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

0e753d713c0621f37831f0c0298ef397.png

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

5f441dec2b5248362bd7dedbad190a37.png

2.值相等性

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

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

854187edc409d02b748d09cd4fe50072.png

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

454c725a4a81ff6d21bb4c0868ba1c5c.png

结论

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值