记录类型
一、记录类型
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