24

C# 的未来:主构造函数

 4 years ago
source link: https://www.infoq.cn/article/Tu5GcSZLWD0glcbhU6Sg
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

复制代码

classC(stringx)
{
publicstringX
{
get=>x;
set{
if(value ==null)
thrownewNullArgumentException(nameof(X));
x = value;
}
}
}

编译为…

复制代码

classC
{
privatestring_x;

publicC(stringx)
{
_x = x;
}
publicstringX
{
get=> x;
set{
if(value==null)
thrownewNullArgumentException(nameof(X));
x =value;
}
}
}

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

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

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

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

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

HaloFour 也参与了该话题:

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

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

原文链接:

C# Futures: Primary Constructors


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK