【Dart语言第7篇】变量声明

1. var

类似于 JavaScript 中的 var,它可以接收任何类型的变量,但最大的不同是 Dart 中 var 变量一旦赋值,类型便会确定,则不能再改变其类型,如:

var T = "hello world";
// 下面代码在dart中会报错,因为变量t的类型已经确定为String,
// 类型一旦确定后则不能再更改其类型。
T = 1024;

上面的代码在 JavaScript 是没有问题的,前端开发者需要注意一下,之所以有此差异是因为 Dart 本身是一个强类型语言,任何变量都是有确定类型的,在 Dart 中,当用var声明一个变量后,Dart 在编译时会根据第一次赋值数据的类型来推断其类型,编译结束后其类型就已经被确定,而 JavaScript 是纯粹的弱类型脚本语言,var 只是变量的声明方式而已。

2. dynamicObject

ObjectDart 所有对象的根基类,也就是说在 Dart 中所有类型都是Object的子类(包括 FunctionNull),所以任何类型的数据都可以赋值给Object声明的对象。 dynamicObject声明的变量都可以赋值任意对象,且后期可以改变赋值的类型,这和 var 是不同的,如:

dynamic S;
Object B;
S = 'Hello';
B = 'World';
// 下面代码不会报错
S = 1024;
B = 1024;

dynamicObject 不同的是 dynamic 声明的对象编译器会提供所有可能的组合,而 Object 声明的对象只能使用 Object 的属性和方法,否则编译器会报错,如:

dynamic a;
Object b = "";
main() {
  a = "";
  printLengths();
}

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

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

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

3、finalconst

如果你从未打算更改一个变量,那么使用 finalconst ,不是 var,也不是一个类型,一个 final 变量只能被设置一次,两者区别在于:const 变量是一个编译时常量(编译时直接替换成常量值),final 变量在第一次使用时被初始化。被 final 或者 const 修饰的变量,变量类型可以省略,如:

// 可以省略string这个类型声明
final str = 'hello world';
// final String str = 'hello world';
const str1 = 'hello world';
// const String str1 = "hello world";

4、空安全(null-safety)

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

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

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

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

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

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

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

fun?.call() // fun 不为空时则会被调用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

small_Axe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值