写点什么

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:1610514

评论

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

APP“小动作”不断?HarmonyOS 3隐私中心可视化面板让它无处藏身

极客天地

FusionInsight MRS Flink DataStream API读写Hudi实践

华为云开发者联盟

大数据 华为云 数据读写 企业号十月 PK 榜

DTSE Tech Talk | 第10期:云会议带你入门音视频世界

华为云开发者联盟

云计算 后端 华为云 企业号十月 PK 榜

蜂巢再获权威认可 | 一个被甲方、乙方都认可的测评

青藤云安全

网络安全

首个中文Stable Diffusion模型开源;TPU演进十年;18个PyTorch性能优化技巧 | AI系统前沿动态

OneFlow

人工智能 开源 深度学历 TPU

90 条简单实用的 Python 编程技巧,建议收藏

千锋IT教育

前端手写面试题,看这一篇就够了

helloworld1024fd

JavaScript

优化开发人员对 K8s 安全的影响

HummerCloud

Kubernetes DevSecOps 11月月更

ShardingSphere + OpenSergo,共同提升微服务体系下数据库的性能与稳定

SphereEx

数据库 微服务 Apache ShardingSphere

手写JavaScript常见5种设计模式

helloworld1024fd

JavaScript

Flask框架:如何运用Ajax轮询动态绘图

华为云开发者联盟

JavaScript 前端 华为云 企业号十月 PK 榜

学习MySQL必须掌握的13个关键字,你get了吗?

小小怪下士

Java MySQL 程序员

clickhouse在风控-风险洞察领域的探索与实践

京东科技开发者

flink 数据 Clickhouse 风控 风险控制

前端vue多人写作开发技巧-路由配置

千锋IT教育

火山引擎DataTester :让字节“跳动”起来的A/B实验平台

字节跳动数据平台

大数据 火山引擎 A/B 测试

从源码角度看React-Hydrate原理

flyzz177

React

源码学习之Spring容器创建原理

京东科技开发者

xml spring 源码 容器 测试

手写现代前端框架diff算法-前端面试进阶

helloworld1024fd

JavaScript

河南数字经济产业创新研究院加入星策社区,携手推进企业智能化转型发展

星策开源社区

人工智能 开源 AI 企业转型 智能化

高级前端一面常考手写面试题指南

helloworld1024fd

JavaScript

5年匠心之作,云原生安全真经大公开!

青藤云安全

网络安全 青藤云安全 云原生安全

深入react源码看setState究竟做了什么?

flyzz177

React

什么是Maven

莪是男神

Java maven 11月月更

人工智能计算机视觉之OCR(光学字符识别)

XiaoChao_AI

人工智能 CV 计算机视觉 11月月更

从recat源码角度看setState流程

flyzz177

React

python的成员方法的简单介绍

乔乔

11月月更

为提高 SDLC 安全,GitHub 发布新功能|GitHub Universe 2022

SEAL安全

GitHub 安全

一个 SaaS 软件同本地部署 On-Premises 系统集成的实际项目案例分享

汪子熙

微服务 SaaS 系统集成 On-Premises 11月月更

GaiaX开源解读 | 跨端动态化模板引擎详解,看完你也能写一个

阿里巴巴文娱技术

开源 移动开发 移动端开发

全国信安标委杨建军秘书长一行莅临青藤,调研指导网络安全标准和产业工作

青藤云安全

网络安全 青藤云安全

Spring框架中都用到了哪些设计模式 ?

千锋IT教育

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