C#语法手册

C# 9.0 记录record 的使用


C# 9.0 新内容 record 记录的基本语法与使用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSGDemoCSG012
{
    //https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/record


    //#csg012-01
    //record(记录) 从 C# 9 开始引入。
    //你可以使用 record 关键字定义一个引用类型,以使用内置的数据封装功能。
    //record内建的主要功能包括:
    //1.支持 == 和 != 操作符,该功能由编译器在编译时重载了 Object.Equals 方法
    //2.内建的格式化显示,record 对象的 toString 输出为 { <property name> = <value>, <property name> = <value>, ...}
    //3.支持元组的解构


    //#csg012-02
    //record的声明
    //下面这两种声明方式是等效的
    //基于位置参数的声明,属性不可变
    public record Person(string FirstName, string LastName);

    //#csg012-02
    //标准属性语法声明
    public record Person
    {
        public string FirstName { get; init; }
        public string LastName { get; init; }
    };


    //#csg012-03
    //除了上面的属性不可变声明方式外,你也可以使用下面的方式来声明可变属性的record
    public record Person_Mutable
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    };


    public class Class1
    {
        public void Demo()
        {
            //#csg012-04
            //创建 record 实例的两种方式
            var p = new Person("三", "张");
            Person p1 = new("四", "李");

            //#csg012-05
            //使用 with 操作 更新 record 实例,with操作会返回一个新的实例,而不是在原来的实例上进行修改
            var p2 = p with { FirstName = "四" };

            //#csg012-06
            //record 实例支持直接对比操作
            var p3 = new Person("三", "张");
            Console.WriteLine(p == p1);// output: False

            Console.WriteLine(p == p3);// output: True


            //#csg012-07
            //record 对象支持元祖的解构,
            var car = new Car("BYD", 200000);
            var (brand, price) = car;
            Console.WriteLine(brand);
            Console.WriteLine(price);

        }

        public record Car(string Brand,int Price);
    }




}