Dart tour: 3、变量
声明变量#
在
Dart中,字符串即可以使用双引号"", 也可以使用单引号''包裹。
在 Dart 中由于有类型推断特性,因此也可以直接用 var 关键字声明变量; 通过 var 关键字声明变量,与通过标记类型来声明是等价的。
通过 var 关键字声明变量时,如果未赋初始值。则会声明为 dynamic 类型,表示任意类型。初始值为 null,通过 ${var.runtimeType} 可以检查运行时的数据类型。
默认值#
在
sound null safety特性未打开时(在Dart 2.12中引入), 对象默认为可空类型(nullable)。已开启sound null safety特性的情况在单独开篇分析。
未赋初始值的变量,默认值都为 null;由于现在 sound null safety 特性默认被打开,需要在文件前加上 // @dart=2.9。
Late 变量#
在 Dart 2.12 中引入了 late 修饰符, 有以下两种功能:
- 声明一个延迟初始化的非空变量.
- 延迟初始化变量(惰性初始化).
由于 Dart 流程分析的缺陷,当全局变量未初始化时(初始过的无问题),无法判断在使用前是否已赋值。尝试运行会报错,这时候可以加 late 修饰符 解决这个问题。
当将变量标记为 late 但在声明时对其进行初始化时,则初始化代码将在首次使用该变量时运行。惰性初始化适用于在以下情况:
- 有可能不需要该变量,且初始化的成本很高。
- 在初始化变量过程中需要访问到
this属性。
Final 和 Const#
当变量不可以被修改时,可以使用关键字 final 或者 const 修饰变量。这两个关键字可以替代 var 关键字或者加在类型前。
二者的异同点如下:
final变量只可以被赋值一次;- 实例变量 可以是
final的但不可以是const的。 const变量是一个编译时常量(const变量同时也是final的)final变量可以在声明的时候不初始化,而const必须在声明时赋值。- 如果使用
const修饰类中的变量,则必须加上static关键字,即static const(注:顺序不能颠倒) - 尽管
final的对象不可以被修改, 但其对象的成员可以被修改;而const的对象的成员不可以被修改,是不可变的。 - 也可以将构造函数声明为
const的,这种类型的构造函数创建的对象是不可变的。
如果使用初始化表达式为常量赋值可以省略掉关键字 const,比如上面的常量 baz 的赋值就省略掉了 const。