ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

record 类型

2022-06-21 00:31:26  阅读:200  来源: 互联网

标签:Console 记录 Person person2 record person1 类型 output


结构类型来设计以数据为中心的类型,这些类型提供值相等性,并且很少或没有任何行为。 但对于相对较大的数据模型,结构类型有一些缺点:

  • 它们不支持继承。
  • 它们在确定值相等性时效率较低。 对于值类型,ValueType.Equals 方法使用反射来查找所有字段。 对于记录,编译器将生成 Equals 方法。 实际上,记录中的值相等性实现的速度明显更快。
  • 在某些情况下,它们会占用更多内存,因为每个实例都有所有数据的完整副本。 记录类型是引用类型,因此,记录实例只包含对数据的引用。

记录类型解决了上述的问题

声明record时,编译器将创建以下内容:

  • 为记录声明中提供的每个位置参数提供一个公共的 init-only 自动实现的属性。 init-only 属性只能在构造函数中或使用属性初始值设定项来设置。
  • 主构造函数,它的参数与记录声明上的位置参数匹配。
  • 一个 Deconstruct 方法,对记录声明中提供的每个位置参数都有一个 out 参数。

不可变性

记录类型不一定是不可变的。 可以用 set 访问器和非 readonly 的字段来声明属性。 虽然记录可以是可变的,但它们使创建不可变的数据模型变得更容易。 使用位置语法创建的属性是不可变的。

如果希望以数据为中心的类型是线程安全的,或者哈希表中的哈希代码保持不变,那么不可变性很有用。 它可以防止在通过引用方法传递参数而该方法意外更改参数值时发生的 bug。

值相等性

如果记录类型的两个变量类型相匹配,且所有属性和字段值都一致,那么记录类型的两个变量是相等的。但这两个变量的引用是不同的

Person person1 = new("Nancy", "Davolio", phoneNumbers);
    Person person2 = new("Nancy", "Davolio", phoneNumbers);
    Console.WriteLine(person1 == person2); // output: True

    Console.WriteLine(ReferenceEquals(person1, person2)); // output: False

非破坏性变化

如果需要改变记录实例的不可变属性,可以使用 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] };
    Console.WriteLine(person1);
    // output: Person { FirstName = Nancy, LastName = Davolio, PhoneNumbers = System.String[] }

    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 { PhoneNumbers = new string[1] };
    Console.WriteLine(person2);
    // output: Person { FirstName = Nancy, LastName = Davolio, PhoneNumbers = System.String[] }
    Console.WriteLine(person1 == person2); // output: False

    person2 = person1 with { };
    Console.WriteLine(person1 == person2); // output: True
}

 

继承

一条记录可以从另一条记录继承。 但是,记录不能从类继承,类也不能从记录继承。

 

标签:Console,记录,Person,person2,record,person1,类型,output
来源: https://www.cnblogs.com/yetsen/p/16395301.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有