记录结构的目的是什么?

Yun*_*iza 13 c# types language-concepts c#-10.0

C# 9 添加了record类型,这是一种使用基于值的相等性的新引用类型。

C# 10 引入了record struct用于定义具有与record( https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/record ) 类似属性的值类型的语法。

创建一个类型的值类型版本似乎很不寻常,该类型被创建为具有基于值的相等性的引用类型 - 这肯定会消除使用该类型的大部分好处。

你为什么要声明 a record struct?

我还缺少什么吗?

Yun*_*iza 17

使用的主要好处record struct如下:

  1. 它允许您将struct定义简化为一行
  2. 它提供了==和!=运算符的重载,因此可以将它们用于比较,而无需额外的代码来定义运算符重载。使用 时struct,您只能使用Equals()默认方法进行比较。
  3. 它提供了ToString()比struct. 该record struct ToString()方法将生成record struct名称、其属性的名称及其值。struct默认方法ToString()仅生成struct名称。
  4. 它提供的性能优势struct(速度提高了 20 倍 - https://anthonygiretti.com/2021/08/03/introducing-c-10-record-struct/)

在某些方面,record类似于提供默认运算符重载的值元组,并且具有ToString()更接近的方法record struct(值元组的ToString()方法生成其所有属性的值)。

但是,值元组仅动态使用,而record struct可用于定义将重复使用的类型。

笔记

record/record class默认情况下是不可变的,但实际上record struct并非如此,因此如果您想要一个不可变的record struct,则必须使用readonly record struct.

最后评论

record struct考虑到使用over的好处struct,最好总是首选record struct,除非有一些非常具体的理由不这样做。

这似乎record struct是 的增强struct,保留了旧类型,因此现有的行为/功能struct不会被删除。

  • 仅供参考,对于那些像我一样偶然发现这篇文章的人:只有当您不在结构上实现 IEquatable<T> 和 GetHashCode 时,性能的提高才会明显。基准测试中甚至提到了这一点。另外,如果您自己在 struct 上实现一些东西,您可能会获得非常非常轻微的性能改进。基准测试的实际页面在这里:https://nietras.com/2021/06/14/csharp-10-record-struct/ 因此,我的建议是使用对您和您的需求最方便的任何内容(例如性能/control,使用结构体,否则使用记录) (4认同)
  • @Mike我的目的不是鼓励它的使用,而是更多地寻找它存在的理由并陈述它们。与往常一样,人们应该权衡自己的需求并选择最好的,而不是自动尝试优化他们可能想到的一切。 (3认同)