C# 的未来:主构造函数

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 的未来:主构造函数相关的知识,希望对你有一定的参考价值。

我们上次提到主构造函数是 2014 年,当时, C# 6 和 VB 12 的候选列表上去掉了主构造函数。去年底,主构造函数重新出现,作为提案#2691 ,现在成为 C# 9 的一个候选项。

主构造函数背后的基本思想是减少初始化类所需的样板代码量。

class C(string x){ public string X { get => x; set {  if (value == null)  throw new NullArgumentException(nameof(X));  x = value;  } }}

编译为…

class C{ private string _x;  public C(string x) { _x = x; } public string X { get => x; set {  if (value == null)  throw new NullArgumentException(nameof(X));  x = value;  } }}

Richard Gibson 对它们的用处进行了总结:

从我们 30 个类的代码库中快速抽样表明,其中的 22 个(73%)已定义了显式构造函数,而有 21 个(>95%)什么也没做,只是设置了私有只读字段)人们很少阅读可以自动生成的代码(通常被跳过,因为它们通常看上去很傻),因此,它们常常是让人大吃一惊的错误来源。

他继续解释道,这些错误通常是因为不小心把构造函数参数赋给了错误的字段。

这个概念跟我们在 C#和 VB 中更简单的不可变对象报告的记录提案有很大的重合。MgSam 写道:

该提案似乎与目前的记录提案完全不相容。我不同意提案中的说法,提案提到这比记录更有用。我认为,这可以节省一些样板记录,而记录(以及自动生成 GetHashCode、Equals 和 ToString 相关的功能)在很多场景中有可能节约大量模板。

HaloFour 也参与了该话题:

按照为 C#提出的记录方式,它们包括对称构造和解构,以及基于一组特定属性的识别。假设这些参数也是属性,那么主构造函数把这些都放在一个参数列表中,并且该列表给我们提供了一个可以解构这些属性的顺序。

正如他们所提出的,C#记录更像 Scala 的 case 类或 F#单例联合,并且,这两种语言都根据它们的构造方式定义构造。

以上是关于C# 的未来:主构造函数的主要内容,如果未能解决你的问题,请参考以下文章

SparkContext主构造函数代码提取

c# 如何结束函数

前端片段整理

C#常用代码片段备忘

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段