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)