C#学习 [类型系统] 记录(14)

要求

C#9.0.

概念

记录是一个类或结构,它为使用数据模型提供特定的语法和行为。

使用场景

  • 想要定义依赖值相等性的数据模型。

例如:想要判断两个对象实例值是否想等,这个时候用record就更加合适。

  • 想要定义对象不可变的类型。

值相等性

值相等性是指如果记录类型的两个变量类型相匹配,且所有属性和字段值都相同,那么记录类型的两个变量是相等的。

不可变性

不可变类型会阻止你在对象实例化后更改该对象的任何属性或字段值。

与类和结构的区别

声明和实例化类或结构时使用的语法与操作记录时的相同。 只是将 class 关键字替换为 record,或者使用 record struct 而不是 struct。 同样地,记录类支持相同的表示继承关系的语法。

  1. 记录与类的区别如下所示:
  • 可在主构造函数中使用位置参数来创建和实例化具有不可变属性的类型。
  • 在类中指示引用相等性或不相等的方法和运算符(例如 Object.Equals(Object) 和 ==)在记录中指示值相等性或不相等。
  • 可使用 with 表达式对不可变对象创建在所选属性中具有新值的副本。
  • 记录的 ToString 方法会创建一个格式字符串,它显示对象的类型名称及其所有公共属性的名称和值。
  • 记录可从另一个记录继承。 但记录不可从类继承,类也不可从记录继承。
  1. 记录结构与结构的不同之处是,编译器合成了方法来确定相等性和 ToString。 编译器为位置记录结构合成 Deconstruct 方法。

示例

  1. 定义一个record
public record Person(string FirstName, string LastName);

public static class Program
{
    public static void Main()
    {
        Person person = new("Nancy", "Davolio");
        Console.WriteLine(person);
        // output: Person { FirstName = Nancy, LastName = Davolio }
    }

}
  1. 值相等性
public record Person(string FirstName, string LastName, string[] PhoneNumbers);
public static class Program
{
    public static void Main()
    {
        var phoneNumbers = new string[2];
        Person person1 = new("Nancy", "Davolio", phoneNumbers);
        Person person2 = new("Nancy", "Davolio", phoneNumbers);
        // 判断值是否相等
        Console.WriteLine(person1 == person2); // output: True
        // 改变了person1.PhoneNumbers[0],person2也是引用这个,所以结果想等
        person1.PhoneNumbers[0] = "555-1234";
        Console.WriteLine(person1 == person2); // output: True
        // 判断引用是否想等,肯定不是!
        Console.WriteLine(ReferenceEquals(person1, person2)); // output: False
    }
}
  1. with表达式改变其中一个属性
public record Person(string FirstName, string LastName)
{
    public required string[] PhoneNumbers { get; init; }
}

public class Program
{
    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
    }
}
posted @ 2024-10-30 10:05  huiy_小溪  阅读(3)  评论(0编辑  收藏  举报