c# 9增加了record
类型,这是一个新的引用类型,使用基于值的相等。
c# 10引入了record struct
语法来定义与record
(https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/record)相似的值类型。
创建一个引用类型的值类型版本,并且该类型还具有基于值的相等性,这似乎是不寻常的——这肯定会消除使用该类型的大部分好处。
为什么要声明一个record struct
呢?
我还错过了什么吗?
使用record struct
的主要好处如下:
- 它允许您将
struct
定义简化为单行 - 它为
==
和!=
操作符提供了重载,因此这些操作符可以用于比较,而不需要额外的代码来定义操作符重载。对于struct
,默认情况下只能使用Equals()
方法进行比较。 - 它提供了比
struct
更全面的默认ToString()
方法。record struct
ToString()
方法将生成record struct
名称、其属性名称及其值。struct
默认的ToString()
方法只产生struct
的名称。 - 它提供了比
struct
性能优势(高达20倍快- https://anthonygiretti.com/2021/08/03/introducing-c-10-record-struct/)
在某些方面,record
类似于提供默认操作符重载的值元组,并且具有更接近record struct
的ToString()
方法(值元组的ToString()
方法产生其所有属性的值)。
然而,值元组只能在动态中使用,而record struct
可以用来定义将被重复使用的类型。
注意
record
/record class
默认是不可变的,但record struct
不是,所以如果你想要一个不可变的record struct
,你必须使用readonly record struct
。
<<h3>最后评论/h3>考虑到使用record struct
比使用struct
的好处,除非有非常特殊的原因,否则最好总是使用record struct
。
似乎record struct
是struct
的增强,保留了旧类型,因此struct
的现有行为/功能不会被删除。