写点什么

C# 的未来:主构造函数

  • 2020-02-18
  • 本文字数:852 字

    阅读完需:约 3 分钟

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# Futures: Primary Constructors


2020-02-18 10:1610748

评论

发布
暂无评论
发现更多内容

【架构与设计】常见微服务分层架构的区别和落地实践

京东科技开发者

鸿蒙网络编程系列9-使用HttpRequest模拟登录示例

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

帝心个人介绍

帝心

HarmonyOS HarmonyOS NEXT

鸿蒙网络编程系列11-使用HttpRequest上传文件到服务端示例

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

Apache Dubbo 3.3 全新发布:Triple X 领衔,开启微服务通信新时代

Apache Dubbo

微服务 dubbo RPC 中间件 Java.

如何从真实数据中挑选高质量数据:提升模型性能的关键技巧

测吧(北京)科技有限公司

测试

鸿蒙网络编程系列8-TLS安全数据传输双向认证示例

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

鸿蒙网络编程系列10-使用HttpRequest下载文件到本地示例

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

从专家系统到机器学习:人工智能核心概念的历史演进与发展脉络

测吧(北京)科技有限公司

测试

一图了解华为开发者空间,领取你的专属云主机

华为云开发者联盟

鸿蒙 云主机 GaussDB 昇腾

Tritonserver 在得物的最佳实践

得物技术

GPU推理 KubeAI平台部署 KubeAI

如何配置 GreptimeDB 作为 Prometheus 的长期存储

Greptime 格睿科技

时序数据库 技术分享

MySQL性能优化浅析及线上案例

京东科技开发者

模型训练的科学基础:训练集、验证集与测试集的区别与应用策略

测吧(北京)科技有限公司

测试

自学习与数据闭环:构建稳定机器学习模型的核心技术

测吧(北京)科技有限公司

测试

数据与特征在AI模型中的作用:如何通过实际问题优化机器学习模型

测吧(北京)科技有限公司

测试

鸿蒙网络编程系列7-TLS安全数据传输单向认证示例

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

大数据实时链路备战——数据双流高保真压测

京东科技开发者

Amazon Q Developer 实践:零基础创建贪吃蛇游戏

亚马逊云科技 (Amazon Web Services)

人工智能 生成式人工智能 Amaozn Q

SD-WAN最低需要多少带宽?带宽计算方法

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商 SDWAN SD-WAN国际专线

Linux_进程理解、状态与优先级(详细版)

不在线第一只蜗牛

Linux 运维 服务器

C# 的未来:主构造函数_语言 & 开发_Jonathan Allen_InfoQ精选文章