Dart 变量

简介: Dart 中的变量声明与初始化支持类型推断和显式声明。`var` 用于类型推断,如 `var name = Bob`;也可显式指定类型,如 `String name = Bob`。Dart 强制执行空安全,防止空解引用错误,并引入可空类型(`String?`)和不可空类型(`String`)。未初始化的不可空变量必须在使用前赋值。`late` 修饰符用于延迟初始化,确保变量在首次使用时才被初始化。`final` 和 `const` 用于定义不可变变量,前者运行时确定,后者编译时确定。类型检查和转换通过 `is` 和 `as` 实现。

这是一个创建变量并对其进行初始化的示例:

var name = 'Bob';
AI 代码解读

变量存储引用。名为 name 的变量包含对值为“Bob”的 String 对象的引用。

name 变量的类型被推断为 String ,但您可以通过指定它来更改该类型。如果对象不受限于单一类型,请指定 Object 类型(如果需要,则指定 dynamic )。

Object name = 'Bob';
AI 代码解读

另一种选择是显式声明将被推断的类型:

String name = 'Bob';
AI 代码解读

此页面遵循 样式指南建议
即对局部变量使用 var ,而不是类型注解。

空安全

Dart 语言强制执行健全的空安全。

空安全可防止因无意访问设置为 null 的变量而导致的错误。此错误称为空解引用错误。当您访问表达式(其计算结果为 null )的属性或调用其方法时,就会发生空解引用错误。此规则的例外情况是当 null 支持属性或方法时,例如 toString()hashCode 。使用空安全,Dart 编译器会在编译时检测这些潜在错误。

例如,假设您想找到 int 变量 i 的绝对值。如果 inull ,则调用 i.abs() 会导致空解引用错误。在其他语言中,尝试此操作可能会导致运行时错误,但 Dart 的编译器会禁止这些操作。因此,Dart 应用不会导致运行时错误。

空安全引入了三个主要更改:

  1. 当您为变量、参数或其他相关组件指定类型时,您可以控制该类型是否允许 null 。要启用可空性,请在类型声明的末尾添加 ?
String? name  // 可空类型。可以是 `null` 或字符串。

String name   // 不可空类型。不能是 `null` ,但可以是字符串。
AI 代码解读
  1. 您必须在使用变量之前对其进行初始化。可空变量默认为 null ,因此它们默认情况下已初始化。Dart 不会为不可空类型设置初始值。它强制您设置初始值。Dart 不允许您观察未初始化的变量。这可以防止您访问属性或调用方法,其中接收方的类型可以是 null ,但 null 不支持使用的方法或属性。
  2. 您不能访问具有可空类型的表达式的属性或调用其方法。相同的异常适用于 null 支持的属性或方法,例如 hashCodetoString()

健全的空安全将潜在的 运行时错误 转换为 编辑时 分析错误。当非空变量已被:

  • 未初始化为非空值。
  • 分配了 null 值。

此检查允许您在部署应用 之前 纠正这些错误。

默认值

具有可空类型的未初始化变量的初始值为 null 。即使是具有数字类型的变量最初也是 null,因为数字(就像 Dart 中的所有其他内容一样)都是对象。

int? lineCount;
assert(lineCount == null);
AI 代码解读

生产代码会忽略 assert() 调用。另一方面,在开发过程中,如果 condition 为假,则
assert(condition) 会引发异常。

使用空安全,您必须在使用不可空变量之前对其进行初始化:

int lineCount = 0;
AI 代码解读

您不必在声明局部变量的地方对其进行初始化,但您确实需要在使用它之前为其赋值。例如,以下代码是有效的,因为 Dart 可以检测到在将 lineCount 传递给 print() 之前它是非空的:

int lineCount;

if (weLikeToCount) {
   
  lineCount = countLines();
} else {
   
  lineCount = 0;
}

print(lineCount);
AI 代码解读

顶级变量和类变量是延迟初始化的;初始化代码在第一次使用变量时运行。

延迟变量

late 修饰符有两种用例:

  • 声明一个在声明后初始化的不可空变量。
  • 延迟初始化变量。

通常,Dart 的控制流分析可以检测到在使用不可空变量之前何时将其设置为非空值,但有时分析会失败。两种常见情况是顶级变量和实例变量:Dart 通常无法确定它们是否已设置,因此它不会尝试。

如果您确定在使用变量之前已设置该变量,但 Dart 不同意,则可以通过将变量标记为 late 来纠正此错误:

late String description;

void main() {
   
  description = 'Feijoada!';
  print(description);
}
AI 代码解读

注意
如果您未能初始化 late 变量,则在使用该变量时会发生运行时错误。

当您将变量标记为 late 但在其声明处对其进行初始化时,则在第一次使用该变量时运行初始化程序。这种延迟初始化在以下几种情况下非常方便:

  • 可能不需要该变量,并且初始化该变量的成本很高。
  • 您正在初始化实例变量,并且其初始化程序需要访问 this

在以下示例中,如果从未使用 temperature 变量,则从未调用代价高昂的 readThermometer() 函数:

// 这是程序对 readThermometer() 的唯一调用。
late String temperature = readThermometer(); // 延迟初始化。
AI 代码解读

final 和 const

如果您不打算更改变量,请使用 finalconst ,替换 var 或添加到类型中。 final 变量只能设置一次; const 变量是编译时常量。( const 变量隐式为 final 。)

备注
实例变量 可以是 final ,但不能是 const

以下是创建和设置 final 变量的示例:

final name = 'Bob'; // 没有类型注解
final String nickname = 'Bobby';
AI 代码解读

您不能更改 final 变量的值:

```dart tag=fails-sa
name = 'Alice'; // 错误:final 变量只能设置一次。


对于希望成为 **编译时常量** 的变量,请使用 `const` 。如果 `const` 变量位于类级别,请将其标记为 `static const` 。在声明变量的地方,将值设置为编译时常量,例如数字或字符串文字、 `const` 变量或对常量数字进行算术运算的结果:

```dart
const bar = 1000000; // 压力单位 (dynes/cm2)
const double atm = 1.01325 * bar; // 标准大气压
AI 代码解读

const 关键字不仅仅用于声明常量变量。您还可以使用它来创建常量 ,以及声明创建常量值的构造函数。任何变量都可以具有常量值。

var foo = const [];
final bar = const [];
const baz = []; // 等同于 `const []`
AI 代码解读

您可以从 const 声明的初始化表达式中省略 const ,如上面的 baz 一样。有关详细信息,请参阅 不要冗余地使用 const 。

您可以更改非 final、非 const 变量的值,即使它以前具有 const 值:

foo = [1, 2, 3]; // 以前是 const []
AI 代码解读

您不能更改 const 变量的值:

baz = [42]; // 错误:常量变量不能赋值。
AI 代码解读

您可以定义使用

类型检查和强制转换 ( isas )、

集合 if

和 扩展运算符 ( ......? )的常量:

const Object i = 3; // i 是具有 int 值的 const Object ...
const list = [i as int]; // 使用类型转换。
const map = {
   if (i is int) i: 'int'}; // 使用 is 和集合 if。
const set = {
   if (list is List<int>) ...list}; // ...和扩展运算符。
AI 代码解读

备注
虽然不能修改 final 对象,但可以更改其字段。相比之下,不能更改 const 对象及其字段:它们是 不可变的

原文:https://dart.wendang.dev/language/variables/

目录
打赏
0
79
79
0
102
分享
相关文章
N..
|
9月前
|
Dart语言中类的定义和使用
Dart语言中类的定义和使用
N..
92 0
Dart基础-main及变量、常量、注释
Dart基础-main及变量、常量、注释
|
8月前
|
Dart编程入门:main方法、变量、常量和注释
Dart编程入门:main方法、变量、常量和注释
Dart语言中函数的定义
Dart语言中函数的定义
N..
78 0
dart语言中的常量与变量
dart语言中的常量与变量
80 0
【Dart语言解密】想要深入了解Dart语法和类型变量吗?
【Dart语言解密】想要深入了解Dart语法和类型变量吗?
180 0
dart 语言中的 常量 与 变量
本文介绍 dart 语言中的 常量 与 变量
101 0
Dart之 方法定义
Dart之 方法定义
129 0
Dart之 方法定义
Dart之 闭包
Dart之 闭包
98 0
Dart之 闭包
那些你不知道的Dart细节之变量(一)
在Dart中变量的声明有三个关键字:var、dynamic和Object,
131 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等