![4dbd0f23708d854fc1ec2b0d3d1f8fad.png](https://i-blog.csdnimg.cn/blog_migrate/5b4633abbdc9ccdb9ef6cacb9657a321.png)
点击上方蓝色文字关注我们吧~
C# 9.0 向 C# 语言添加了以下功能和增强功能:
记录
仅限 Init 的资源库
顶级语句
模式匹配增强功能
本机大小的整数
函数指针
禁止发出 localsinit 标志
目标类型的新表达式
静态匿名函数
目标类型的条件表达式
协变返回类型
扩展
GetEnumerator
支持foreach
循环Lambda 弃元参数
本地函数的属性
模块初始值设定项
分部方法的新功能
.NET 5 支持 C# 9.0。
![1ca73ac251ca1add2ca57c15d0e189ad.png](https://i-blog.csdnimg.cn/blog_migrate/192d7adaa383b9ccd96ef25657357571.png)
记录类型
C# 9.0 引入了记录类型,这是一种引用类型,它提供合成方法来提供值语义,从而实现相等性。 默认情况下,记录是不可变的。
使用记录类型可在 .NET 中轻松创建不可变的引用类型。 以前,.NET 类型主要分为引用类型(包括类和匿名类型)和值类型(包括结构和元组)。 虽然建议使用不可变的值类型,但可变的值类型通常不会引入错误。 值类型变量可保存值,因此在将值类型传递给方法时,会对原始数据的副本进行更改。
不可变的引用类型也有许多优点。 这些优点在使用共享数据的并发程序中更为明显。 遗憾的是,C# 强制编写大量额外的代码来创建不可变的引用类型。 记录为不可变的引用类型提供类型声明,该引用类型使用值语义实现相等性。 如果用于实现相等性的合成方法的属性和哈希代码的属性都相等,则认为两条记录相等。 请考虑以下定义:
记录定义会创建一个包含两个只读属性(FirstName
和 LastName
)的 Person
类型。 Person
类型是引用类型。 如果查看 IL,它就是一个类。 它是不可变的,因为在创建它后,无法修改任何属性。 定义记录类型时,编译器会合成其他几种方法:
基于值的相等性比较方法
替代 GetHashCode()
复制和克隆成员
PrintMembers
和 ToString()Deconstruct
方法
记录支持继承。 可声明派生自 Person
的新记录,如下所示:
还可密封记录以防止进一步派生:
编译器会合成上述方法的不同版本。 方法签名取决于记录类型是否密封以及直接基类是否为对象。 记录应具有以下功能:
相等性是基于值的,包括检查类型是否匹配。 例如,即使两条记录的名称相同,
Student
也不能等于Person
。记录具有为你生成的一致的字符串表示形式。
记录支持副本构造。 正确的副本构造必须包括继承层次结构和开发人员添加的属性。
可通过修改复制记录。 这些复制和修改操作支持非破坏性转变。
所有记录都支持析