C#9 中可变记录的用途是什么?

Mar*_*ius 21 c# record

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

Pet*_*r B 24

首先:arecord只是一个快速、简短的符号,用于声明一个类,该类具有一些免费自动添加的有用功能(复制构造函数+克隆+散列+比较/相等)。但最终的结果仍然是一个类,就像其他类一样。它是语法糖,实际上有两种口味。

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

record Person(string FirstName, string LastName);
Run Code Online (Sandbox Code Playgroud)

不太短的名义语法使开发人员负责指定set或init为每个属性:

record Person
{
    public string FirstName { get; set; }
    public string LastName { get; init; }
}
Run Code Online (Sandbox Code Playgroud)

提供这两种表示法的原因是没有“一刀切”的说法。

更详细的名义语法允许用很少的代码创建一个类,具有位置语法不提供的自定义(im)可变性,同时仍然免费获得复制构造函数+克隆+散列+比较/相等。

最后但并非最不重要的一点是,这两种变体 - 就像类一样 - 允许添加其他字段、属性和方法(如果需要),例如:

record Person(string FirstName, string LastName)
{
    public string FavColor;
    public string GetDisplayText()
    {
        return LastName + " " + FavColor;
    }
}
Run Code Online (Sandbox Code Playgroud)