我们上次提到主构造函数是 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# 的未来:主构造函数相关推荐

  1. 【Kotlin】Kotlin 类的继承 一 ( 类继承基本方式 | final 关键字 | 子类主构造函数 | 子类次构造函数 )

    文章目录 I . 类继承基本方式 II . 使用 final 禁止类继承 / 方法重写 III . 父类没有主构造函数 IV . 父类有主构造函数 V . 父类构造函数与子类构造函数总结 I . 类继 ...

  2. 【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )

    文章目录 I . 主构造函数 II . 主构造函数声明属性 III . init 初始化代码块 IV . 主构造函数参数 和 成员变量访问方式 V . 主构造函数 可见性 设置 VI . 次构造函数 ...

  3. scala 主构造函数_Scala-构造函数

    /* scala的构造函数分为主构造函数和辅助构造函数. 一.主构造函数 在Scala中,每个类都有主构造函数,和类的定义交织在一起. 一个Scala类的主构造函数包括:1.构造函数的参数:2.类体中 ...

  4. scala 主构造函数_在Scala中,如何在类的主构造函数中定义局部参数?

    在Scala中,如何在不是数据成员的类的主构造函数中定义局部参数,例如,仅用于初始化基类中的数据成员? 例如,在下面的代码中,如何在B类的主构造函数中正确定义参数b,以便它只生成临时本地参数而不是数据 ...

  5. Kotlin 主构造函数与次构造函数的理解

    遇到了Kotlin: Primary constructor call expected的报错 如果类有一个主构造函数,每个次构造函数需要委托给主构造函数, 可以直接委托或者通过别的次构造函数间接委托 ...

  6. Android学习-Kotlin语言入门-变量、函数、语法糖、when、for-in、主构造函数、单例类、函数式API、集合遍历、隐式Intent、Activity生命周期、四种启动模式、标准函数

    探究java语言的运行机制 变量.函数.语法糖 when条件语句 for循环 主构造函数.次构造函数 数据类和单例类 集合的创建与遍历 集合的函数式API 创建菜单 隐式使用Intent Activi ...

  7. 关于scala中的主构造函数

    在前期scala的学习中我们一般添加变量时采用的是java风格的成员定义方式,例如下面的代码. class Student{var name : String = _ } Scala会生成一个默认的构 ...

  8. dart系列之:dart类中的构造函数

    文章目录 简介 传统的构造函数 命名构造函数 构造函数的执行顺序 重定向构造函数 Constant构造函数 工厂构造函数 总结 简介 dart作为一种面向对象的语言,class是必不可少的.dart中 ...

  9. kotlin 构造函数_Kotlin程序| 主要构造函数示例

    kotlin 构造函数 主要建设者 (Primary Constructor) A Kotlin class have Primary constructor and one or more Seco ...

最新文章

  1. mysql数据库技术方案,MySql数据库优化方案
  2. 从赖斯想谈恋爱-------到教育的启迪
  3. 如何打印CloudFoundry上应用运行时的环境变量
  4. android获取button宽度,android – 如何获得Button的高度和宽度
  5. (相当全面)node.js 初体验
  6. python装饰器使用多吗_如何理解Python装饰器?
  7. 如何使用CCRenderTexture创建动态纹理 Cocos2d-x 2 1 4
  8. opencv-api morphologyEx
  9. 一步步实现SDDC-NSX MGR安装和主机准备
  10. 9102年,曝光这几个高质量的公众号,年薪7位数!
  11. 统计图源代码_openlayers4 入门开发系列结合 echarts4 实现统计图(附源码下载)
  12. 数据结构实验二---单链表的实现
  13. SpringBoot邮箱注册验证
  14. 如何用c语言读文件,如何用C语言读写文件
  15. excel部分快捷键
  16. 检查网络是否畅通的四个步骤
  17. ardupiolt AP_AHRS库类的分析(一)AP_AHRS_NavEKF
  18. IOS 代码修改故事版中的自动布局参数
  19. 高温定型窗帘值得我们选择吗?-江南爱窗帘十大品牌
  20. matlab根号下是多项式,多项式求根

热门文章

  1. net MVC 重定向总结
  2. Oracle 在 多个Virtualbox 虚拟机间 跨不同物理宿主机进行通信
  3. CiberCut_5.6 标牌制作
  4. ProSolid下的遍历访问封装代码
  5. [(转)hystar整理]Entity Framework 教程
  6. 《蛋白质女孩》的一句台词
  7. 实践App内存优化:如何有序地做内存分析与优化
  8. git 使用详解-- tag打标签
  9. CentOS利用crontab执行计划任务
  10. 5.[BX]和Loop指令