写点什么

dart 系列之: 和 null 说再见,null 使用最佳实践

作者:程序那些事
  • 2021 年 12 月 23 日
  • 本文字数:1512 字

    阅读完需:约 5 分钟

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/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

发布于: 2021 年 12 月 23 日
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
dart系列之:和null说再见,null使用最佳实践