Dart 变量

变量是每一们语言的基础,在Dart中所有变量都是对象,并且都有一个初始化的值null

4 min read
By myfreax
Dart 变量
Dart 变量

变量是每一们语言的基础,在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或者constfinal变量只可以赋值一次。

常量变量是编译时的常量,也就是即隐式的finalfinal在类中使用之前必须被初始化。

const关键字不仅用于声明常量变量,例如代码const baz = [];。您还可以使用它来创建常量值,例如代码var foo = const [];,以及声明创建常量值的构造函数。

final name = 'Bob'; // 没有类型声明
final String nickname = 'Bobby';

var foo = const [];
final bar = const [];
const baz = []; // 相当于 const []

您可以改变不是finalconst变量的值,即使变量有一个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关键词。

如果你有任何问题,请在评论反馈。

Related Articles