写点什么

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

评论

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

第 4 周作业

Steven

极客大学架构师训练营

架构师训练营第 1 期 第 8 周作业

李循律

极客大学架构师训练营

过滤Spark数据集的四种方法

大数志

大数据 spark 数据分析 数据科学

训练营第四周学习总结

爱码士

训练营

我画着图,FluentAPI 她自己就生成了

newbe36524

C# .net .net core netcore

每个程序员都应该知道的数字

多颗糖

数据库 计算机基础 存储

面试官:Redis 主从复制时网络开小差了怎么整?

redis 学习 面试

在历史的天空重逢!大话鲲鹏上海记

脑极体

【干货】内存条的基础讲解,够用绝大多数情况

亚兰—硅的传奇official

计算机基础 内存 装机 硬件

【薪火计划】02 - 一将功成万骨枯

码字与律动

管理

flink-sql流计算可视化UI平台

无情

sql flink 实时计算 平台

限流、熔断与降级

idonkeyliu

后台开发 熔断 限流 降级

Java 集合(4)-- iterable和iterator异同分析

秦怀杂货店

Java Iterator和Iterable 集合 iterable

Java 集合(5)-- Collections源码解析

秦怀杂货店

Java 集合 Collections

超赞!吃透这份Github点赞120k的Java知识面试笔记Offer拿到手软

比伯

Java 编程 程序员 架构 面试

第5周 技术选型(一)-作业

SuGeek

极客大学架构师训练营

训练营第4周作业

爱码士

训练营

高性能-Nginx多进程高并发、低时延、高可靠机制在百万级缓存(redis、memcache)代理中间件中的应用

杨亚洲(专注MongoDB及高性能中间件)

nginx memcached 分布式缓存 redis cluster 分布式数据库mongodb

Java集合(3)-- iterable接口超级详细解读

秦怀杂货店

Java 源码 Iterator和Iterable 集合 iterable

SpringBoot系列(5)- 自定义配置

引花眠

springboot

8.6非阻塞网络I/O

张荣召

va_list 可变长参数原理

liu_liu

c 可变参数 va_list

Java集合(1)-- 俯瞰Java集合源码以及分类

秦怀杂货店

Java 源码 Iterator和Iterable JAVA集合

8.5网络通信基本原理与性能优化

张荣召

机器学习的产业化变革中,华为云ModelArts的新成绩单

脑极体

Spring改变版本号命名规则:此举对非英语国家很友好

YourBatman

Spring Boot 语义化 Spring Framework 日历化

架构师训练营 1 期 - 第八周总结(vaik)

行之

极客大学架构师训练营

适合初学者的Web Components教程[2019](译)

西贝

Java Web Component 组件

Java集合(2)-- Iterator接口超级详细解读

秦怀杂货店

Java 源码 Iterator和Iterable 集合 Iterator

学习总结--week08

张荣召

高可用可伸缩微服务架构:基于Dubbo、SpringCloud和ServiceMesh完整蓝光版PDF分享

Java架构追梦

Java 微服务 dubbo Service Mesh SpringCloud

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