派生类构造函数的初始化列表中包含 初始化基类数据成员、新增内嵌对象数据及新增_C# 9.0 中的新增功能...

4dbd0f23708d854fc1ec2b0d3d1f8fad.png

点击上方蓝色文字关注我们吧~

C# 9.0 向 C# 语言添加了以下功能和增强功能:

  • 记录

  • 仅限 Init 的资源库

  • 顶级语句

  • 模式匹配增强功能

  • 本机大小的整数

  • 函数指针

  • 禁止发出 localsinit 标志

  • 目标类型的新表达式

  • 静态匿名函数

  • 目标类型的条件表达式

  • 协变返回类型

  • 扩展 GetEnumerator 支持 foreach 循环

  • Lambda 弃元参数

  • 本地函数的属性

  • 模块初始值设定项

  • 分部方法的新功能

.NET 5 支持 C# 9.0。

1ca73ac251ca1add2ca57c15d0e189ad.png

记录类型

C# 9.0 引入了记录类型,这是一种引用类型,它提供合成方法来提供值语义,从而实现相等性。 默认情况下,记录是不可变的。

使用记录类型可在 .NET 中轻松创建不可变的引用类型。 以前,.NET 类型主要分为引用类型(包括类和匿名类型)和值类型(包括结构和元组)。 虽然建议使用不可变的值类型,但可变的值类型通常不会引入错误。 值类型变量可保存值,因此在将值类型传递给方法时,会对原始数据的副本进行更改。

不可变的引用类型也有许多优点。 这些优点在使用共享数据的并发程序中更为明显。 遗憾的是,C# 强制编写大量额外的代码来创建不可变的引用类型。 记录为不可变的引用类型提供类型声明,该引用类型使用值语义实现相等性。 如果用于实现相等性的合成方法的属性和哈希代码的属性都相等,则认为两条记录相等。 请考虑以下定义:

454b1221d99bb35694d7b6ce81483b09.png

记录定义会创建一个包含两个只读属性(FirstName 和 LastName)的 Person 类型。 Person 类型是引用类型。 如果查看 IL,它就是一个类。 它是不可变的,因为在创建它后,无法修改任何属性。 定义记录类型时,编译器会合成其他几种方法:

  • 基于值的相等性比较方法

  • 替代 GetHashCode()

  • 复制和克隆成员

  • PrintMembers 和 ToString()

  • Deconstruct 方法

记录支持继承。 可声明派生自 Person 的新记录,如下所示:

d2a0a6289e7005132da7b92c5c843ad9.png

还可密封记录以防止进一步派生:

05c7b22f9a9707e8842814748bc0b27f.png

编译器会合成上述方法的不同版本。 方法签名取决于记录类型是否密封以及直接基类是否为对象。 记录应具有以下功能:

  • 相等性是基于值的,包括检查类型是否匹配。 例如,即使两条记录的名称相同,Student 也不能等于 Person

  • 记录具有为你生成的一致的字符串表示形式。

  • 记录支持副本构造。 正确的副本构造必须包括继承层次结构和开发人员添加的属性。

  • 可通过修改复制记录。 这些复制和修改操作支持非破坏性转变。

  • 所有记录都支持析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值