封面图

第123期:Dart的基本知识(变量的声明)_JavaScript

非常nice的3D车道线

基本语法

// Define a function.
void printInteger(int aNumber) {
print('The number is $aNumber.'); // Print to console.
}

// This is where the app starts executing.
void main() {
var number = 42; // Declare and initialize a variable.
printInteger(number); // Call a function.
}

void 表示没有返回值。

int 内置数值类型。其他的诸如:string,list,bool等。

main()特殊的,必须的顶层方法,表示程序的开始。

var 声明变量。

重要理念

  • 所有可以用变量声明的内容都是对象,每个对象都是类的实例。numbers ,functions,null都是对象,所有对象都继承自Object类。
  • 尽管Dart是强类型的,但类型注释是可选的,因为Dart可以推断类型。在上面的代码中,number被推断为int类型。
  • 如果启用null安全,变量不能包含null,除非我们说可以。我们可以通过在变量类型的末尾加一个问号(?)使其可为null。例如,​​int?​​​可以是整数,也可以为​​null​​​。如果我们知道表达式的计算结果从不为null,但Dart不允许这样,我们可以添加​​!​​断言它不为null(如果为空则抛出异常)。例如:int x=nullableButNotNullInt!
  • 当我们想指定所有的类型都可以时,我们可以使用​​Object?​
  • Dart支持泛型类型,如List<int>(整数列表)或List<Object>(任何类型的对象列表)。
  • Dart支持顶级函数(如main()),以及绑定到类或对象的函数(分别为静态和实例方法)。还可以在函数(嵌套函数或局部函数)中创建函数。
  • 类似地,Dart支持顶级变量,以及绑定到类或对象的变量(静态变量和实例变量)。实例变量有时称为字段或属性。
  • 与Java不同,Dart没有关键字public、protected和private。如果标识符以下划线(_)开头,则它是其库的专用标识符。有关详细信息,请参见库和可见性。
  • 标识符可以以字母或下划线(_)开头,后跟这些字符加数字的任意组合。
  • Dart既有表达式(有运行时值),也有语句(没有)。例如,条件表达式条件?expr1:expr2的值为expr1或expr2。将其与没有值的if-else语句进行比较。语句通常包含一个或多个表达式,但表达式不能直接包含语句。
  • Dart工具可以报告两种问题:警告和错误。警告只是表示代码可能无法工作,但它们不会阻止程序执行。错误可以是编译时或运行时。编译时错误会阻止代码执行;运行时错误导致代码执行时引发异常。

变量

变量存储的是引用。

var name = 'Bob';

变量name包含了一个对值为bob的string 对象的引用。

变量的默认值

未初始化的变量,包含了一个初始值为null的值。

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

int lineCount;

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

print(lineCount);

Late 变量延迟

Dart 2.12添加了late修改器,它有两种用法:

  • 声明一个不可为Null的变量,该变量在声明后初始化。
  • 懒惰地初始化变量。

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

如果您确定某个变量在使用前已设置,但Dart不允许,则可以通过将该变量标记为late来修复错误:

late String description;

void main() {
description = 'Feijoada!';
print(description);
}

当我们将一个变量标记为延迟,但在其声明时对其进行初始化时,初始化器将在第一次使用该变量时运行。这种延迟初始化在以下几种情况下很方便:

  • 变量可能不需要,并且初始化它的成本很高。
  • 我们正在初始化一个实例变量,其初始值设定项需要访问this。
// This is the program's only call to readThermometer().
late String temperature = readThermometer(); // Lazily initialized.

Final 和 const

如果我们从未打算更改变量,则使用final或const代替var,或者除了类型之外。最终变量只能设置一次;常量变量是编译时常量。(Const变量隐式为最终变量。)

final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';

不能更改Final变量的值:

name = 'Alice'; // Error: a final variable can only be set once.

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

const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // Standard atmosphere

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

var foo = const [];
final bar = const [];
const baz = []; // Equivalent to `const []`

我们不能修改const定义的变量的值:

baz = [42]; // Error: Constant variables can't be assigned a value.