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

简介: 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用法的最佳实践。

相关文章
|
6月前
|
Dart JavaScript 安全
|
Dart 安全 编译器
dart系列之:安全看我,dart中的安全特性null safety
dart系列之:安全看我,dart中的安全特性null safety
|
6月前
|
机器学习/深度学习 SQL 关系型数据库
【MySQL进阶之路丨第十一篇】一文带你精通MySQL NULL值处理、正则表达式
【MySQL进阶之路丨第十一篇】一文带你精通MySQL NULL值处理、正则表达式
86 0
|
6月前
|
SQL 关系型数据库 MySQL
总结 vue3 的一些知识点:MySQL NULL 值处理
总结 vue3 的一些知识点:MySQL NULL 值处理
|
6月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL 关系型数据库 MySQL
python在mysql中插入或者更新null空值
这段代码是Python操作MySQL数据库的示例。它执行SQL查询从表`a_kuakao_school`中选取`id`,`university_id`和`grade`,当`university_id`大于0时按升序排列。然后遍历结果,根据`row[4]`的值决定`grade`是否为`NULL`。若不为空,`grade`被格式化为字符串;否则,设为`NULL`。接着构造UPDATE语句更新`university`表中对应`id`的`grade`值,并提交事务。重要的是,字符串`NULL`不应加引号,否则更新会失败。
154 2
|
3月前
|
SQL 关系型数据库 MySQL
在 MySQL 中使用 IS NULL
【8月更文挑战第12天】
640 0
在 MySQL 中使用 IS NULL
|
3月前
|
SQL 关系型数据库 MySQL
mysql不等于<>取特定值反向条件的时候字段有null值或空值读取不到数据
对于数据库开发的专业人士来说,理解NULL的特性并知道如何正确地在查询中处理它们是非常重要的。以上所介绍的技巧和实例可以帮助你更精准地执行数据库查询,并确保数据的完整性和准确性。在编写代码和设计数据库结构时,牢记这些细节将有助于你避免许多常见的错误,提高数据库应用的质量与性能。
121 0
|
4月前
|
SQL 存储 索引
MySQL设计规约问题之为什么应该把字段定义为NOT NULL并且提供默认值
MySQL设计规约问题之为什么应该把字段定义为NOT NULL并且提供默认值
|
5月前
|
SQL 关系型数据库 MySQL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
343 0