变量是每一们语言的基础,在Dart中所有变量都是对象,并且都有一个初始化的值null。
虽然在Dart中的变量的类型声明的是可选的,但是Dart建议在变量使用类型声明。
在本教程,我们将说明如何dart语言的变量声明与初始化,以及变量的默认值。
变量声明与初始化
Dart 变量存储的是引用,代码var name = 'Bob';
的name
变量引用的是一个 String
对象,值是Bob
。
这个name
变量会被Dart 类型系统推断为String
,如果你不确定的变量的类型,你也可以将变量的类型指定为Object
或者dynamic
类型。
另一种选择为变量是显式声明类型,这是Dart 推荐的方式变量声明和初始化的方式。
var name = 'Bob';
dynamic name = 'Bob';
String name = 'Bob';
Dart 类型注释是可选的,这里的类型注释,可以是其它语言类型声明或者类型定义。如果你是没有开发经验的新手,可以不必正确理解以下内容。
如果省略类型注释,Dart 会尝试根据上下文推断类型。有时它没有足够的信息来推断出正确类型。
当发生这种情况时,Dart 有时会报告错误,但通常会声明dynamic
,这个过程通常称为类型隐式转换。隐式转换为dynamic
使代码看起来是推断是正确且安全的。
但实际完全禁用了类型检查。下面的规则在推断失败时要求指定类型来避免这种情况。
类型推断是一种强大的工具,可以让您省去编写无趣的类型工作。它使读者的注意力集中在代码本身的行为上。
显式类型也是健壮、可维护代码的关键部分。它们定义API的静态规范并创建边界以记录和强制允许哪些类型的值允许的。
当然,类型推断不是魔法。有时推理成功并选择了一种类型,但它可能不是您想要的类型。
常见的情况是从变量的初始化中推断出过于精确的类型。而您又打算稍后将其他类型的值分配给变量,在这种情况下,您必须显式地声明类型。
变量默认值
未初始化的变量都有一个初始值null
,如果你没有选择null空安全,那么每个变量都有一个可以为null类型。
即使在初始化变量类型指定类型为数值,也是初始化为null值。因为在Dart中一切都是对象。
如果开启null安全,则必须在声明变量时初始化变量的值。但在Dart 2.1.2添加late
修改器允许在开启null安全的情况预先声明变量。
late
修改器通常用于预先初始化不可为空的变量。惰性初始化一个变量。
int lineCount;
int lineCount = 0;
late String description;
Final 与 const
如果你一直不打算改变变量,则可以将变量声明为final
或者const
。final
变量只可以赋值一次。
常量变量是编译时的常量,也就是即隐式的final
,final
在类中使用之前必须被初始化。
const关键字不仅用于声明常量变量,例如代码const baz = [];
。您还可以使用它来创建常量值,例如代码var foo = const [];
,以及声明创建常量值的构造函数。
final name = 'Bob'; // 没有类型声明
final String nickname = 'Bobby';
var foo = const [];
final bar = const [];
const baz = []; // 相当于 const []
您可以改变不是final
,const
变量的值,即使变量有一个const
值。
例如代码var foo = const [];
不是一个常量变量但它具有常量值const [];
。因此你可以修改变量foo
的值。
但是如果你尝试修改常量变量的值,Dart 将会抛出静态分析错误Error: Constant variables can't be assigned a value。
例如代码const baz = [];
,假如你尝试修改常量baz
的值,运行代码baz = [42];
,Dart将会抛出错误。
结论
至此,你已经理解Dart 变量的初始化,变量的默认值,变量在开启null空安全时必须初始化变量,或者使用late修改器进行声明再初始化,最后理解常量变量,常量值以及final
关键词。
如果你有任何问题,请在评论反馈。