dart系列之和null说再见,null使用最佳实践
简介
null可能是大家在编写程序中最为头疼的一个东西,稍不留意的情况下就有可能使用到了这个空字符。所以dart在2.12引入了nll safety,默认情况下强制所有的类型都不为null,只有在你认为它可以为null的时候才可以设置为null。
虽然有了null safety,但是这里还有一些我们需要考虑的null的最佳实践。 不需要初始化对象为null
在dart2.12之后,所有的对象都强制为非空的,除非你显示指定其为可空的对象。
如果一个对象可以为空,那么我们可以这样指定: String? name;
如果定义一个对象可以为空,那么对dart来说会隐式对其初始化为null。
所以下面的显示初始化为null是完全没有必要的: String? name=null;
同样的,如果参数是一个可以为空的对象,那么dart也会将其初始化为null,我们也没有必要显示去设置其值: void echoName(String? name){ print(name); } null的三元操作符
所谓三元就是有三个变量,我们常见的三元操作符就是?:,通常来说是这样用的: name==null?true:false;
上面的逻辑实际上是把一个null转换成了一个bool类型。
为了实现这个功能,dart提供了一个更加简洁的操作符??, 可以这样使用: name??false;
上面的代码表示如果name是空,则返回false。
注意,这里只是返回值改变了,但是name值本身并没有变化,也不会将name从一个可为空的类型,变成不为空的类型。所以如果我们在if语句里面对字符进行判断,则还是需要显示进行null的比较: int measureMessage(String? message) { if (message != null && message.isNotEmpty) { // dart知道message不为空 return message.length; } return 0; }
如果这样编写,则会出现异常: int measureMessage(String? message) { if (message?.isNotEmpty ?? false) { //dart并不知道message不为空 return message!.length; } return 0; } 如果在使用中需要判断类型是否为空,则不要使用late
late是做什么用的呢?late表示该类型目前不会初始化,但是会在未来的某个时间对其进行初始化。
所以,如果你用late表示某个类型,那么在后续使用的时候是不需要进行手动判断该类型是否为空的。
如果你仍然要手动判断,那么就没必要设置该类型为late。 本地变量的类型提升
dart有一个非常好的特性,就是当我们判断一个变量不为空之后,该变量就会被提升为非空变量。
当提升为非空变量之后,就可以自由访问该非空变量内部的属性和方法了。
但是可惜的是,dart中的类型提升只是针对与local变量或者参数而言的,对于类变量或者是top level的变量并不适用,所以我们需要将这些变量拷贝到本地变量,从而使用类型提升的特性。
我们看下面的例子: class UploadException { final Response? response; UploadException([this.response]); @override String toString() { var response = this.response; if (response != null) { return "Could not complete upload to {response.url} " "(error code{response.errorCode}): ${response.reason}."; } return "Could not upload (no response)."; } }
其中UploadException中的response是一个顶级变量,虽然我们对其进行测试是否为空,但是在使用的过程中还是不能直接访问其内部的属性,因为response可能为空。
为了使用dart的类型提升的特性,我们可以将顶级的变量赋值给一个本地变量,从而在null测试之后,自动将其提升为非空的类型,从而直接访问其内部的属性。 总结
以上就是dart中null用法的最佳实践。 本文已收录于 http://www.flydean.com/29-dart-null-effective/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
一旦你学习了typescript,你就再也放不下了什么是TypeScriptTypeScript是JavaScript的超集,当前的JavaScript的代码都属于TypeScript,都能在TypeScript环境下运行。Typ
javascript中的深拷贝和浅拷贝数据复制是我们编程中经常会使用到的技术,对于普通数值数据来说,复制很简单,但是对于复杂类型比如对象的复制,就会有很多需要考虑的东西,比如我们经常说到的深拷贝和浅拷贝。浅拷贝复制的对
linux和macos和windows的系统比较操作系统什么是操作系统?操作系统就是用来管理计算机软硬件的程序。它本身也是一种软件程序,不过与一般的软件程序不同的是,它主要用来和硬件打交道,负责管理cpu的调度,负责设备的调度,
云徙科技周欣告别价格竞争,起航消费者运营数字化时代的到来,带动了中国新一轮的消费升级。而大环境的冲击下,零售企业纷纷寻求数字化转型,开启了新战略新布局。随之,为零售行业提供数字化服务的公司也快速发展。同时,零售已经是一个
全国联动!首批三城!最让CXO上瘾的巡展来了3月起,我们将在广州上海北京杭州青岛成都三亚等城市开讲,进行全国数字化巡展,为大家带来最前沿的数字化观点与最核心的数字化转型实践3月5日,李克强总理在政府工作报告中总结回顾了202
元气森林数字化营销是在Z时代特立独行我们要不断打造一个更高效的渠道体系,要做端到端的数据打通,用数字技术来降低成本作者勾践素材来源于网络2020年10月末,创始人唐彬森宣布2021年线下销售目标75亿元。要知道,这是
原来你们这么表里不一今天是女神节,说起IT行业中的女性大家都有怎样的印象呢?也许是不拘一格更或者女汉子?在IT行业女生们也发挥着半边天的作用对于她们来说明明可以靠脸却要靠才华成为一名IT媛巾帼不让须眉
云徙科技周莹顾问一出手,就知有没有作为一名专业的顾问,我们的业余时间不是那么好界定的。我们除了在客户现场的支持,剩余的时间都是需要我们,为更好的客户现场表现持续积累的过程,周莹说。周莹,云徙消费品事业部首席架构师,
数字化领域最会玩的云徙科技,开了一场嗨爆的云年会从中台赛道第一位实践者到如今数字中台领导者云徙科技领跑中国企业数字化转型截止目前已牵手100多家各行业一流企业向每一位奋斗向上的云徙人致敬1月29日,云徙年度盛会如约而至。为了响应
赋能行业智慧聚焦数字化年度风云之2020震撼上线引言发展数字经济,不断加快数字产业化和产业数字化,推动数字经济和实体经济深度融合,已经成为全球经济发展的重要趋势。2020年,注定是不平凡的一年,也是中国数字经济的起飞元年。年初的
云徙科技蓝华数字化转型是每家药企都应该具备的基本能力2020年元旦,华灯初上。人们在街头欢呼雀跃地庆祝新一年的开启时,没有人会想到史上最难对付的病毒,像乌云一样迅速笼罩在了所有人的头顶。对于处在一线的医药行业而言,这次是危机,也是一