其他分享
首页 > 其他分享> > record 类型

record 类型

作者:互联网

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

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

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

不可变性

记录类型不一定是不可变的。 可以用 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