【问题标题】:What's the usecase for mutable records in C#9?C#9 中可变记录的用例是什么?
【发布时间】:2021-04-12 14:47:18
【问题描述】:

C# 9 终于添加了记录!我一直在等这个,太棒了!但我想知道用{ get; set; } 记录的意义何在?似乎记录应该是不可变的,并对其所有属性使用{ get; init; }。也许我太习惯于使用不可变数据,但我不明白可变记录的意义。似乎它增加了代码中出现错误的可能性。我错过了一个非常明显且有用的用例吗?

【问题讨论】:

  • 要获取记录的其他特征,例如其他简单类型/DTO 的位置​​解构和值相等?
  • .NET 运行时本身在核心上不支持不可变类型作为一等公民,因此假装记录(这只是编写类的一种新方式)提供“真正的”不变性(其中有几种口味!)价值有限。记录是朝那个方向迈出的一步,但不是最终决定,试图将它们与(强制)不变性结合起来是一座太远的桥梁。 See also, see also.

标签: c# record


【解决方案1】:

首先:record 只是一个快速、简短的符号,用于声明一个具有一些自动免费添加的有用功能的类 - 但最终结果仍然是一个与其他类一样的类。它是语法糖,实际上有两种口味。

超短的位置语法使所有属性init-only:

record Person(string FirstName, string LastName);

较短的名义语法使开发人员负责为每个属性指定setinit

record Person
{
    public string FirstName { get; set; }
    public string LastName { get; init; }
}

提供这两种符号的原因是没有“一刀切”。名义语法允许使用非常少的代码创建一个具有特定自定义(im)可变性的类,并且仍然免费获得复制构造函数 + 克隆 + 散列 + 比较/相等。

【讨论】:

    猜你喜欢
    • 2022-06-21
    • 1970-01-01
    • 2022-11-26
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    相关资源
    最近更新 更多