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# 的未来:主构造函数相关推荐
- 【Kotlin】Kotlin 类的继承 一 ( 类继承基本方式 | final 关键字 | 子类主构造函数 | 子类次构造函数 )
文章目录 I . 类继承基本方式 II . 使用 final 禁止类继承 / 方法重写 III . 父类没有主构造函数 IV . 父类有主构造函数 V . 父类构造函数与子类构造函数总结 I . 类继 ...
- 【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )
文章目录 I . 主构造函数 II . 主构造函数声明属性 III . init 初始化代码块 IV . 主构造函数参数 和 成员变量访问方式 V . 主构造函数 可见性 设置 VI . 次构造函数 ...
- scala 主构造函数_Scala-构造函数
/* scala的构造函数分为主构造函数和辅助构造函数. 一.主构造函数 在Scala中,每个类都有主构造函数,和类的定义交织在一起. 一个Scala类的主构造函数包括:1.构造函数的参数:2.类体中 ...
- scala 主构造函数_在Scala中,如何在类的主构造函数中定义局部参数?
在Scala中,如何在不是数据成员的类的主构造函数中定义局部参数,例如,仅用于初始化基类中的数据成员? 例如,在下面的代码中,如何在B类的主构造函数中正确定义参数b,以便它只生成临时本地参数而不是数据 ...
- Kotlin 主构造函数与次构造函数的理解
遇到了Kotlin: Primary constructor call expected的报错 如果类有一个主构造函数,每个次构造函数需要委托给主构造函数, 可以直接委托或者通过别的次构造函数间接委托 ...
- Android学习-Kotlin语言入门-变量、函数、语法糖、when、for-in、主构造函数、单例类、函数式API、集合遍历、隐式Intent、Activity生命周期、四种启动模式、标准函数
探究java语言的运行机制 变量.函数.语法糖 when条件语句 for循环 主构造函数.次构造函数 数据类和单例类 集合的创建与遍历 集合的函数式API 创建菜单 隐式使用Intent Activi ...
- 关于scala中的主构造函数
在前期scala的学习中我们一般添加变量时采用的是java风格的成员定义方式,例如下面的代码. class Student{var name : String = _ } Scala会生成一个默认的构 ...
- dart系列之:dart类中的构造函数
文章目录 简介 传统的构造函数 命名构造函数 构造函数的执行顺序 重定向构造函数 Constant构造函数 工厂构造函数 总结 简介 dart作为一种面向对象的语言,class是必不可少的.dart中 ...
- kotlin 构造函数_Kotlin程序| 主要构造函数示例
kotlin 构造函数 主要建设者 (Primary Constructor) A Kotlin class have Primary constructor and one or more Seco ...
最新文章
- mysql数据库技术方案,MySql数据库优化方案
- 从赖斯想谈恋爱-------到教育的启迪
- 如何打印CloudFoundry上应用运行时的环境变量
- android获取button宽度,android – 如何获得Button的高度和宽度
- (相当全面)node.js 初体验
- python装饰器使用多吗_如何理解Python装饰器?
- 如何使用CCRenderTexture创建动态纹理 Cocos2d-x 2 1 4
- opencv-api morphologyEx
- 一步步实现SDDC-NSX MGR安装和主机准备
- 9102年,曝光这几个高质量的公众号,年薪7位数!
- 统计图源代码_openlayers4 入门开发系列结合 echarts4 实现统计图(附源码下载)
- 数据结构实验二---单链表的实现
- SpringBoot邮箱注册验证
- 如何用c语言读文件,如何用C语言读写文件
- excel部分快捷键
- 检查网络是否畅通的四个步骤
- ardupiolt AP_AHRS库类的分析(一)AP_AHRS_NavEKF
- IOS 代码修改故事版中的自动布局参数
- 高温定型窗帘值得我们选择吗?-江南爱窗帘十大品牌
- matlab根号下是多项式,多项式求根