[英]What's the use of the record type in C# (in ASP.NET Core MVC)?
最近我在 C# 中发现了第三种对象类型: record
; 实际上 2: record struct
和record class
。 据我了解,该类型与普通类没有显着差异(我从未在我的程序中使用过结构)。 在我看来,最大的优势是它们更容易构造,因为它们的构造函数+property-in-1 语法。 这是一个正确的观点吗? 然后我想用它们在 ASP.NET Core MVC 框架中构建我的视图模型。 我不知道他们为什么只是将语法添加到类中? 对我错过某些东西的怀疑使我无法使用它们。
以下是一些可以利用记录类型的优势场景,请检查性能部分:)
- 用于创建具有不可变属性的引用类型的简洁语法
您可以使用位置参数来声明记录的属性并在创建实例时初始化属性值
public record Person(string FirstName, string LastName);
public static void Main()
{
Person person = new("Nancy", "Davolio");
Console.WriteLine(person);
// output: Person { FirstName = Nancy, LastName = Davolio }
}
对以数据为中心的引用类型有用的内置行为:
- 价值平等
对于 class 类型,如果两个对象在 memory 中引用相同的 object,则两个对象相等,而对于记录类型,包括记录结构和只读记录类型结构,两个对象相等,如果它们是
- 无损突变的简洁语法
如果你需要复制一个经过一些修改的实例,你可以使用 with 表达式来实现无损突变。 with 表达式创建一个新记录实例,它是现有记录实例的副本,并修改了指定的属性和字段。
public record Person(string FirstName, string LastName) { public string[] PhoneNumbers { get; init; } } public static void Main() { Person person1 = new("Nancy", "Davolio") { PhoneNumbers = new string[1] }; Person person2 = person1 with { FirstName = "John" }; Console.WriteLine(person2); // output: Person { FirstName = John, LastName = Davolio, PhoneNumbers = System.String[] } Console.WriteLine(person1 == person2); // output: False. . . person2 = person1 with { }; Console.WriteLine(person1 == person2); // output: True
- 用于显示的内置格式
记录类型具有编译器生成的 ToString 方法,该方法显示公共属性和字段的名称和值。 ToString 方法返回以下格式的字符串:
"<record type name> { <property name> = <value>, <property name> = <value>, ...}"
支持 inheritance 层次结构
一条记录可以继承自另一条记录。 但是,记录不能从 class 继承,并且 class 不能从记录继承。
派生记录类型中的位置参数
派生记录为基本记录主构造函数中的所有参数声明位置参数。 基本记录声明并初始化这些属性。 派生记录不会隐藏它们,而只会为未在其基本记录中声明的参数创建和初始化属性。
inheritance 层次结构中的平等
要使两个记录变量相等,运行时类型必须相等。
在派生记录中使用表达式
with 表达式的结果与表达式的操作数具有相同的运行时类型。 运行时类型的所有属性都被复制,但您只能设置编译时类型的属性
派生记录中的 PrintMembers 格式
派生记录类型的合成 PrintMembers 方法调用基本实现。 结果是派生类型和基类型的所有公共属性和字段都包含在 ToString output 中
派生记录中的解构器行为
派生记录的 Deconstruct 方法返回编译时类型的所有位置属性的值。 如果变量类型是基本记录,则只有基本记录属性被解构,除非 object 被强制转换为派生类型。
- 转换 object 非常高效!
检查这篇文章
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.