什么';C#9中可变记录的用例是什么?

什么';C#9中可变记录的用例是什么?,c#,record,C#,Record,C#9终于添加了记录!我一直在等这个,太棒了!但是我想知道拥有一个{get;set;}的记录有什么意义?似乎记录应该是不可变的,并对其所有属性使用{get;init;}。也许我太习惯于处理不可变的数据了,但我不理解可变记录的意义。这似乎增加了代码中bug的可能性。我是否错过了一个非常明显且有用的用例?首先:记录只不过是一个快速、简短的符号,用于声明一个类,并自动免费添加了几个有用的特性—但最终的结果仍然是一个与任何其他类一样的类。它是一种句法上的糖,实际上有两种味道 超短的位置语法仅使所有属性i

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

首先:记录只不过是一个快速、简短的符号,用于声明一个类,并自动免费添加了几个有用的特性—但最终的结果仍然是一个与任何其他类一样的类。它是一种句法上的糖,实际上有两种味道

超短的位置语法仅使所有属性
init

record Person(string FirstName, string LastName);
较短的名词语法使开发商负责为每个属性指定:

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

提供这两种符号背后的原因可能是不存在“一刀切”的做法。标称语法允许快速创建具有自定义(im)易变性的常规类,并且仍然可以免费获得副本构造函数、克隆、哈希和比较/相等。

要获得记录的其他功能,例如其他简单类型/DTO的位置解构和值相等,请使用.NET运行时本身作为核心,不支持作为一级公民的不可变类型,因此假装记录(这只是编写类的一种新方式)提供“真正的”不可变性(有几种风格!)的价值有限。记录是朝着这个方向迈出的一步,但不是最后一步,试图将它们与(强制的)不变性结合起来是一座太远的桥梁。