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。