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

问题描述 投票:0回答:1

C# 9 终于添加记录了!我等了很久了,太棒了!但我想知道用

{ get; set; }
录制唱片有什么意义?看起来记录应该是不可变的,并使用
{ get; init; }
来表示它们的所有属性。也许我太习惯使用不可变数据,但我不明白可变记录的意义。看起来它只是增加了代码中出现错误的可能性。我是否错过了一个非常明显且有用的用例?

c# record
1个回答
21
投票

首先:

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

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

init-only

record Person(string FirstName, string LastName);

较短的标称语法使开发人员负责为每个属性指定

set
init

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

提供这两种符号的原因是没有“一刀切”。

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

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

record Person(string FirstName, string LastName)
{
    public string FavColor;
    public string GetDisplayText()
    {
        return LastName + " " + FavColor;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.