美文网首页
Dart简介1--变量声明

Dart简介1--变量声明

作者: 逃离_102 | 来源:发表于2022-09-19 21:59 被阅读0次

    说明

    Dart的变量跟其他语言,有些不同,对于了解别的语言的人,有些是值得注意的。

    1.1 var和val

    类似于 JavaScript 中的var,它可以接收任何类型的变量,但最大的不同是Dart 中 var 变量一旦赋值,类型便会确定,则不能再改变其类型。因为 Dart 本身是一个强类型语言,任何变量都是有确定类型的,在 Dart 中,当用var声明一个变量后,Dart 在编译时会根据第一次赋值数据的类型来推断其类型,编译结束后其类型就已经被确定,而 JavaScript 是纯粹的弱类型脚本语言,var 只是变量的声明方式而已。
    val在Dart中没有,但是kotlin中有引入,这里就顺便说说。val是一个只读变量,这种声明变量的方式相当于final变量。一个val创建的时候必须初始化,因为以后不能被改变。

    1.2 dynamic 和 Object

    Object 是 Dart 所有对象的根基类,也就是说在 Dart 中所有类型都是Object的子类(包括Function和Null),所以任何类型的数据都可以赋值给Object声明的对象。dynamic与Object声明的变量都可以赋值任意对象,且后期可以改变赋值的类型,这和 var 是不同的。dynamic与Object不同的是dynamic声明的对象编译器会提供所有可能的组合,而Object声明的对象只能使用 Object 的属性与方法, 否则编译器会报错。如下:

     dynamic a;
     Object b = "";
     main() {
        a = "";
        // 正常
        a.length;
        // 报错 The getter 'length' is not defined for the class 'Object'
        b.length;
     }   
    

    所以dynamic 的这个特点使得我们在使用它时需要格外注意,这很容易引入一个运行时错误,比如下面代码在编译时不会报错,而在运行时会报错:

    print(a.xx); // a是字符串,没有"xx"属性,编译时不会报错,运行时会报错
    

    1.3 3. final和const

    用final和const修饰的变量只能被设置一次,两者区别在于:const 变量是一个编译时常量(编译时直接替换为常量值),final变量在第一次使用时被初始化。

    1.4. 空安全(null-safety)

    Dart 中一切都是对象,这意味着如果我们定义一个数字,在初始化它之前如果我们使用了它,假如没有某种检查机制,则不会报错,比如:

    test() {
      int i; 
      i=i*8;
    }
    

    在 Dart 引入空安全之前,上面代码在执行前不会报错,但会触发一个运行时错误,原因是 i 的值为 null 。但现在有了空安全,则定义变量时我们可以指定变量是可空还是不可空。

    int i = 8; //默认为不可空,必须在定义时初始化。
    int? j; // 定义为可空类型,对于可空变量,我们在使用前必须判空。
    
    // 如果我们预期变量不能为空,但在定义时不能确定其初始值,则可以加上late关键字,
    // 表示会稍后初始化,但是在正式使用它之前必须得保证初始化过了,否则会报错
    late int k;
    k=9;
    

    如果一个变量我们定义为可空类型,在某些情况下即使我们给它赋值过了,但是预处理器仍然有可能识别不出,这时我们就要显式(通过在变量后面加一个”!“符号)告诉预处理器它已经不是null了,比如:

    class Test{
      String? str;
      Function? fun;
      say(){
        if(str!=null) {
          print(str! .length); //因为已经判过空,所以能走到这 i 必不为null,如果没有显式申明,则 IDE 会报错
        }
        if(fun!=null){
          fun!(); // 同上
        }
      }
    }
    

    上面中如果函数变量可空时,调用的时候可以用语法糖:

    fun?.call() // fun 不为空时则会被调用
    

    先就写这么多,下面就得边学习边总结,有什么不对的地方,欢迎留言讨论,谢谢!

    相关文章

      网友评论

          本文标题:Dart简介1--变量声明

          本文链接:https://www.haomeiwen.com/subject/hibvortx.html