C# 11 特性 – 自动默认结构

作者 : 慕源网 本文共720个字,预计阅读时间需要2分钟 发布时间: 2022-12-15 共63人阅读

C# 11 特性在了解这些 Struct 类型的新变化之前,先对这个实现的背景做一些了解。在编译时,编译器将获取初始化给定字段的代码并将其放入无参数构造函数中。构造函数本质上是构造结构时调用的函数。  

结构隐式派生自 System.ValueTypeSystem.ValueType 超类实现子类无法覆盖的默认构造函数。 这意味着在结构中显式定义无参数构造函数在物理上是不可能的。由于编译器施加的这种物理限制,编译器不可能获取您的字段初始化代码并将其放入无参数构造函数中。但是,您可以指定一个或多个参数构造函数,并且可以初始化其中的所有字段,如果无法初始化所有字段,则会引发编译时错误。

上面的故事发生在 C# 10 之前,从 C# 10 开始,我们可以创建无参数构造函数,但有一些限制,即,如果无法初始化所有声明的字段,它将引发编译器错误,因为 必须明确分配结构成员字段当它被创建时,因为结构类型直接存储它们的数据。

在上图中,您可以在不同 C# 版本的同一代码块上看到编译时错误消息。在 C# 8.0 中,我们不允许提供任何无参数构造函数,从 C# 10 开始,我们允许使用无参数构造函数,以便用户在创建结构类型对象时可以拥有自己的字段初始化值。

但这是一件乏味的事情,因为您必须确定需要初始化结构上的所有字段或属性,如果如上图所示失败,您将看到相应的编译器错误。

从 C# 11 开始,此限制被取消,编译器将执行一项额外的工作,将代码添加到构造函数中,以在创建对象时初始化缺少的字段或未在构造函数中初始化的字段。 

正如我们在上图中看到的,即使 Name 字段未在构造函数中初始化,也没有报告编译器错误。

这些是自 C# 11 以来结构的新变化,在执行构造函数之前在构造函数中包含自动默认字段。


慕源网 » C# 11 特性 – 自动默认结构

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录