记录类型

一、记录类型

1.record:用来记录类型

  • 使用方法

    • 引用类型记录:不是一种新的类型,它是class用法的一个新用法,新的语法糖,也就是说record class是引用类型(这个在C#9.0中没有record class的写法,直接使用record)。

      • //第一种用法:如果该对象只有一些简单的属性,可使用这种方式
        public record Person(string first, string last);
        //第二种用法:也可以使用这种方法来编写class的代码
        public record Person(string LastName)
        {
        	public string? FirstName { get; set; }
        	public void SayHi()
        	{
        		Console.WriteLine($"Hello! My name is {LastName}·{FirstName}");
        	}
        }
        // 调用第一种方法的示例:
        var p1 = new Person("Smith","Make");
        var p2 = new Person("Smith","Make");
        var p3 = new Person("Bush","Make");
        Console.WriteLine(p1 == p2); // true
        Console.WriteLine(p1 == p3); // false
        
    • 值类型记录:也就是结构体记录

      • record struct

        • public record struct Point(double x, double y);
          
      • readonly record struct

        • public readonly record struct Square(double width);
          
    • 注:值类型记录只针对C#10及以后的版本有效

  • 区别:

    public record Person(string first, string last);
    public record struct Point(double x, double y);
    public readonly record struct Square(double width);
    
    • 相同点
      • 1、对记录的参数,分别生成了属性
      • 2、生成了一个包含记录所有属性的构造函数
      • 3、重写了 Object.Equals(Object)方法和Object.GetHashCode()方法
      • 4、实现了System.IEquatable接口
      • 5、实现了==和!=运算操作
      • 6、实现了Deconstruct方法而实现解构操作
      • 7、重写了Object.ToString()方法,以及创建了一个PrintMembers用于序列化(但是PrintMembers有些许区别)
    • 不同点
      • 1、record class和readonly record struct生成的属性是get和init标识,也就是说它们的对象是只读的,而record struct生成的属性是get和set标识,也就是说它的对象是可读可写的
      • 2、在构造函数上,record class会生成两个构造函数:一个是protected修饰,用于$()方法克隆一个对象,一个public修饰,包含所有的构造参数,而readonly record struct和record struct只包含一个public修饰,包含所有的构造参数的构造函数,但是因为它们的本质还是结构体,因此默认会有一个空构造函数,因此在创建时有区别
      • 3、record class类型记录会生成一个$()方法,它通过调用一个protected的构造函数来克隆出一个新的引用对象,而我们可以通过自定义或者重写这个protected的构造函数的构造函数来实现我们自己业务逻辑。

2.with:用来创建记录类型副本

  • 概念:用于拷贝原有对象,并对特定属性进行修改

  • 使用方法:

    var p1 = new Person("Smith", "Make");
    var p4 = p1 with { first = "Eric" };
    Console.WriteLine(p1 == p4); // print: // false
    Console.WriteLine($"first:{p4.first} last:{p4.last}");//print: // first:Eric last:Make
    
posted @ 2023-02-21 21:37  蜗牛向海  阅读(131)  评论(0编辑  收藏  举报