record是C#9引进来的一个自定义类型,同样class也可以用来定义类型,那么他们有什么区别呢?下面通过一个表格来介绍一下record和class的区别:
record | class |
概念 | |
用来封装数据。 虽然record中也可以定义方法,事件等成员,但通常状况下,record是用来定义实体类,封装数据,特别是对于数据相同类在比较时,判等的情况。 | 用来封装数据和逻辑。 业务模型转成软件模型时,用oop思想来设计软件时,class是最小独立封装单位,也是最理想封装概念。 |
定义 | |
record Order(int Id, string Name, string? Description = null) | class Order(int Id,string Name,string? Description=null) { public int Id { get; }=Id; public string Name { get; }=Name; public string? Description { get; }=Description ; } |
相同点 | |
引用类型 | 引用类型 |
IL中间语言 .class private auto ansi beforefieldinit Order | .class private auto ansi beforefieldinit Order extends [System.Runtime]System.Object |
不同点 | |
IL中间语言: .class private auto ansi beforefieldinit Order | IL中间语言: .class private auto ansi beforefieldinit Order extends [System.Runtime]System.Object |
构造函数中定义的是只读属性 | 构造函数中定义的是私有类全局字段 |
ToString输出结构化数据 | ToString输出当前类型名 |
==,!= 用来比较数据 | ==,!= 用来比较引用地址 |
个性点 | |
当用record struct定义时为值类型 | 无 |
默认定义与record class定义一样 | 无 |
Deconstruct解构函数是独有的 | 无 |
Order order1 = new Order(1, "张三", "苹果"); Order order2 = order1 with {Id = 2,Name = "李四" }; | 不支持With |