第一百二十七回 空安全

文章目录

  • 概念介绍
  • 使用方法
  • 示例代码

我们在上一章回中介绍了级联操作符相关的内容,本章回中将介绍 空安全.闲话休提,让我们一起Talk Flutter吧。

概念介绍

在编译语言中都有空指针或者空对象(null),它们会引起程序的异常。在移动开发中如果使用Java和OC开发程序,发生这类异常后会使应用程序被系统强制关闭,业内通称FATA异常,crash或者叫程序闪退。这种异常是比较严重的程序错误,为了避免程序中发生这种异常dart在2.1版本中引入了空类型,并且基于空类型引入了安全机制,本章回将详细介绍空类型和基于该类型的空安全机制。

使用方法

在dart语言中使用问号表示空类型,定义变量或者对象时可以使用空类型,通常是在类型的后面加一个问号,这样的变量或者对象叫作可空变量或者可空对象,非空变量或者非空对象可以赋值给可空变量或者可空对象,但是可空变量或者可空对象不能赋值给非空变量或者非空对象。

有了空类型后,变量或者对象可能为空,因此,我们在使用空变量或者空对象时需要判断变量或者对象是否为空,不然会引起编译错误,这便是安全机制。有了此机制后把空对象引发的异步提前到程序编译阶段,这样有助于提前发现和解决程序中的错误。

判断空对象使用"?.","!."或者"??"操作符,把这些操作符添加到空对象后面就可以。这些操作符有着不同的含义,详细如下:

  • ?.: 如果对象为空则不做任何操作,否则通过点操作符访问对象的属性或者方法;
  • !.: 当前对象肯定不为空并且通过点操作符访问对象的属性或者方法;
  • ??: 如果对象为空则执行操作符后面的内容,否则不做任何操作;

除了这些操作符外还可以使用三元操作符或者if/else语句来判断对象是否为空,这些内容是基础知识,我就不详细介绍了,稍后我们将通过代码来演示操作符的用法。

示例代码

  ///定义可以空变量和可空对象
  int ? nonIntValue;
  TestObject? nonTObj;

      ///空安全相关内容
    nonIntValue = 3;
    TestObject temp = TestObject(1, 'good');
    ///非空变量可以赋值给可空变量,但是可空变量不能赋值给非空变量
    // nonTObj = temp;
    // temp = nonTObj;
    ///使用可空对象,如果对象为空则不做任何操作,不会访问对象的属性a
    debugPrint('value: ${nonTObj?.a}');

    ///变量的值肯定不为空,这样做不太好,虽然可以通过编译,但是会引起运行时异常
    // debugPrint('value: ${nonTObj!.a}');

    ///判断对象是否为空:如果为空则括号中的值为temp,否则为nonTObj
    debugPrint('value: ${(nonTObj ?? temp).toString()}');
    if(nonTObj == null) {
      debugPrint('nonTobj is null');
    } else {
      debugPrint('nonTobj is not null');
    }

    ///三元操作符
    (nonTObj == null) ? debugPrint('nonTobj is null'): debugPrint('nonTobj is not null');

上面代码中使用的TestObject是自定义的类型,我们没有公布它的源代码,大家可以自己定义一个类型,或者使用语言自带的String类型,总之只要是可以创建对象的类型就可以。

我们在代码中添加了详细的注释,这样方便大家理解代码,建议大家自己动手去编译程序,通过程序的运行结果来分析代码,这样有助于大家更好地掌握空类型和空安全相关的内容。

看官们,与空安全相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

你可能感兴趣的:(一起Talk,Flutter吧,移动开发,dart空安全,dart空类型)