一、变量
1.1 变量初始化
1 | var name = 'Bob'; // name变量被推断成String |
dynamic 和 var区别
var声明类型在初始化即被推断且固定(类型锁定),之后不能在赋其他的类型
dynamic完全允许类型改变,且关闭类型检查。
1.2 空安全
Dart语言强制执行可靠的空安全
当一个值为null时,访问其属性或者调用方法时,就会发生空引用错误。
1 | // 特殊情况 |
空安全三个关键变化
变量可空
1
2
String? name;变量使用之前必须初始化,dart不会默认非可空类型设置初始值
你不能在一个带有表达式的对象上访问属性或调用方法可空类型
1 | String? name = getUserName(); // name 是可空类型 String? |
1.3 默认值
未初始化的可空类型变量初始值为 null。 即使是数值类型的变量也初始为 null
1 | int? lineCount; |
你不必在变量之前初始化,但是在使用前必须为其赋值
1 | int lastTime; |
顶层变量和类变量是惰性初始化的;变量第一次被使用时才会运行初始化代码。
1.4 延迟变量
使用场景:
- 声明一个非空变量
1 | late String description; |
- 懒加载变量
当你将变量标记为
late并在声明时初始化它, 那么初始化器会在变量第一次被使用时运行。
1.5 最终和常量
如果你永远不打算改变一个变量,使用
final或const,可以代替var使用,也可以在类型声明时额外使用。一个 final 变量只能被设置 只有一次;一个 const 变量是一个编译时常量。
const 和 final的区别:
| 特征 | final | const |
|---|---|---|
| 赋值时机 | 运行时 | 编译时 |
| 是否必须编译时常量 | 不需要 | 必须 |
| 内存分配 | 每次运行可能不同 | 同一个值只分配一份(常量折叠) |
| 可用在类级变量 | 可以(实例或静态) | 只能静态(static const) |
| 集合类型 | 可变内部元素(如果集合本身是 final) | 集合本身及内部元素均不可变 |
1.6 通配符变量
一个名为
_的通配符变量声明了一个非绑定的局部变量或参数,本质上是一个占位符。
1 | main() { |