乐趣区

关于dart: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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

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

退出移动版