【问题标题】:When to use record struct instead of struct, and vice versa?何时使用记录结构而不是结构,反之亦然?
【发布时间】:2022-10-24 05:18:28
【问题描述】:

我最近发现了 C# 中的 record 关键字,并看到它可以用作 record struct,如果我理解正确的话,它可以用作值类型而不是引用类型。

但是,我很难理解何时使用record struct 而不仅仅是struct。据我所见,record struct 有一些结构没有的基本实现(如==!= 运算符、ToString 的覆盖以及其他一些东西),但仅此而已两者之间有区别吗?如果不是,在决定使用一种或另一种时需要考虑什么?

从我目前看到的方式来看,最好总是使用record struct 来利用它已经附带的那些实现。

【问题讨论】:

  • 这归结为使用结构与类的问题,“记录”在这个问题中只是横向的。
  • @RodrigoRodrigues 问题与课程无关。这是关于 structrecord struct 之间的区别(在 2021 年与 C# 10 一起引入)。据我所知,这是一个原始问题,以前在 StackOverflow 中从未被问过。
  • 是的,我对问题的理解有误

标签: c# struct c#-9.0 c#-10.0 c#-record-type


【解决方案1】:

这个答案假设:

  • 知道record关键字在c#中的作用;
  • 知道structclass有何不同;

然后,使用struct 而不是record struct 的决定归结为:

  1. 您不需要 record 烘焙的默认实现。

    也许你的结构很短命,它只会被用来传递结构化数据;它将在非常知名的地方创建、使用和处置,您可以完全控制它们的使用。如果您完全确定不需要相等比较、模式匹配或字符串表示,那么您可以避免程序集中的一些元数据和几行文档。

  2. 您不想要 record 烘焙的默认实现。

    这一点有点弱,考虑到您可以将您的类型声明为record struct 并且仍然提供任何自动行为的自定义实现。您甚至可以使用简洁的语法为自动属性指定属性。因此,除非您计划为大多数自动实现提供自定义实现,否则您仍然会从使用record 中受益。

  3. 您不能使用record struct,因为您被锁定在不支持 c#10 的 .net 版本中。

    好吧,在这种情况下没什么好说的。


    总之,record struct 在一般情况下更好,老实说,struct 从一开始就应该是默认的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2020-04-08
    • 2013-10-25
    • 2017-07-05
    • 2010-11-16
    • 2011-03-22
    • 1970-01-01
    相关资源
    最近更新 更多