首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C# 的未来:主构造函数

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

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

代码语言:javascript
复制
class C(string x)
{
    public string X
    {
        get => x;
        set { 
            if (value == null) 
                throw new NullArgumentException(nameof(X)); 
            x = value; 
        }
    }
}

编译为…

代码语言:javascript
复制
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# Futures: Primary Constructors

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/Tu5GcSZLWD0glcbhU6Sg
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券