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);
}
}