.NET6 新东西 --struct 优化
在.NET6 中针对 Struct 做了一些优化,下面我们就通过一些案例来看一下.NET6 中针对 Struct 的优化。
一、Record Struct
虽然在上一个版本中就有了 record,但是上一版本中的的 record 是 class 是一个引用类型,但是 record struct 是值类型是一个结构,它的使用方式如下:
在.NET6 中也支持 record 来声明一个基于 class 的 record,这和原来的 record 是一样的,例如record class RecordModel(int Id, string Name)
这和 record RecordModel(int Id, string Name)
record struct 会自动生成 Equals 和 GetHashCode 并重写==和!=操作符,并且可以用 with 修改部分属性创建新的对象。如果 record struct 声明有参数构造器,则会生成一个隐式的无参构造。代码如下:
运行上述代码可以看到即使没有显式声明无参构造还是会生成一个无参构造来初始化。上述代码输出如下:
二、readonly struct record
我们可以使用 readonly 来标记结构体,也可以使用 readonly struct record,但 record struct 不能使用 ref 修饰。使用 readonly struct record 声明的结构体,如果使用 Primary Constructor 对应的属性会是 init。例如readonly record struct Point(int X, int Y);
属性的声明是这样的:
三、Parameterless Constructor
.NET6 支持用户自定义无参构造方法,我们可以在无参构造方法中加入初始化逻辑,代码如下如下:
这里需要注意 default 和 new 的差别,default 是结构体空状态,不会执行无参构造,new 是会执行,通过反射创建对象的时候也会执行构造,代码输出结果如下:
除了 record 之外,.NET6 还扩展了 with 表达式用法,普通结构体和匿名对象也可以使用 with 来修改部分属性.代码如下:
输出结果如下:
with 只能对 public 成员进行操作,上面代码中的 Z 是 private,因此在 with 表达式中是不能指定。和 record class 相比 record struct 没有 Clone 方法,因为 struct 不需要自带 Clone 功能,record struct 不允许声明 Clone 成员方法,所有 record 都不允许声明 Clone 成员。
评论