Dart 语句与结构

186 阅读5分钟

这里将介绍 Dart 主要功能,从变量和运算符到类和库
假设您已经知道如何使用其他语言编程,学习更多 Dart 核心库, 参考 Dart 库概览
想了解更多有关语言功能的详细信息, 参考 Dart 编程语言规范
Dart 支持单行注释、多行注释和文档注释

Dart 的基本功能

下面的代码用到了很多 Dart 的基本功能:

// 定义一个函数
printInteger(int aNumber) {
  print('The number is $aNumber.'); // 打印到控制台。
}

// 应用从这里开始执行。
main() {
  var number = 42; // 声明并初始化一个变量。
  printInteger(number); // 调用函数。
}

以下是此程序使用的代码,这些代码适用于所有(或几乎所有)的 Dart 应用: // 代码注释 单行注释。 Dart 同样支持多行注释(/* 被注释内容 */)和文档注释 int 数据类型。一些其他 内置类型 包括 String , List , 和 bool 42 字面量。字面量是一种编译型常量 print() 便利输出方式 '...' (or "...") 字符串常量 variableName字符串插值,(更高级的写法variableName 字符串插值,(更高级的写法{expression}): 包括字符串文字内部的变量或表达式的字符串 main() 程序开始执行函数,该函数是特定的、必须的、顶级函数。 有关更多信息,参考 The main() function var 定义变量,通过这种方式定义变量不需要指定变量类型 ⚠️提示: 代码最好遵循 Dart 风格指南中的约定 Dart 风格指南

重要的概念

在学习 Dart 语言时, 应该基于以下事实和概念

  • 在变量中可以放置的所有东西都是对象,而每个对象都是类的实例。无论数字函数和null都是对象。所有对象都继承自Object类
  • 尽管Dart是强类型的,但类型声明是可选的,因为Dart可以推断类型。 在上面的代码中,数字被推断为int类型。 如果要明确说明不需要任何类型,请使用特殊类型dynamic
  • Dart支持通用类型,如List<int>(整数列表)或List<dynamic>(任何类型的对象列表)
  • Dart支持顶级函数(如main()),以及绑定到类或对象(分别是静态方法(static)和实例(instance)方法)的函数。您还可以在函数(嵌套或局部函数)中创建函数
  • 类似地,Dart支持顶级变量,以及绑定到类或对象(静态和实例变量)的变量。实例变量有时被称为字段或属性。
  • 与Java不同,Dart没有public protected private的关键字。如果标识符以下划线(_)开头,则该标识符对其库是私有的
  • 标识符 以字母或下划线(_)开头,后跟任意字母和数字组合。
  • Dart 语法中包含表达式expressions(有运行时值) 和语句statements(没有运行时值) 例如:
    • condition ? expr1 : expr2 的值可能是 expr1 或 expr2
    • 将其与 if-else 语句 相比较,if-else 语句没有值。 一条语句通常包含一个或多个表达式,相反表达式不能直接包含语句
  • Dart 工具提示两种类型问题:警告错误。 警告只是表明代码可能无法正常工作,但不会阻止程序的执行。 错误可能是编译时错误或者运行时错误。 编译时错误会阻止代码的执行; 运行时错误会导致代码在执行过程中引发 [异常](#exception)

注释

单行注释

单行注释以//开始。 所有在 // 和改行结尾之间的内容被编译器忽略。

void main() {
  // TODO: refactor into an AbstractLlamaGreetingFactory?
  print('Welcome to my Llama farm!');
}

多行注释

多行注释以 /* 开始, 以 / 结尾。 所有在 / 和 */ 之间的内容被编译器忽略 (不会忽略文档注释)。 多行注释可以嵌套

void main() {
  /*
   * This is a lot of work. Consider raising chickens.

  Llama larry = Llama();
  larry.feed();
  larry.exercise();
  larry.clean();
   */
}

文档注释

文档注释可以是多行注释,也可以是单行注释, 文档注释以/// 或者 /** 开始。 在连续行上使用 ///与多行文档注释具有相同的效果 在文档注释中,除非用中括号括起来,否则Dart 编译器会忽略所有文本。 使用中括号可以引用类、 方法、 字段、 顶级变量、 函数、 和参数。 括号中的符号会在已记录的程序元素的词法域中进行解析 下面是一个引用其他类和成员的文档注释:

/// A domesticated South American camelid (Lama glama).
///
/// 自从西班牙时代以来,
/// 安第斯文化就将骆驼当做肉食类和运输类动物。
class Llama {
  String name;

  /// 喂养骆驼 [Food].
  ///
  /// 典型的美洲驼每周吃一捆干草。
  void feed(Food food) {
    // ...
  }

  /// 使用 [activity] 训练骆驼
  /// [timeLimit] 分钟。
  void exercise(Activity activity, int timeLimit) {
    // ...
  }
}

在生成的文档中,[Food] 会成为一个链接, 指向 Food 类的 API 文档 解析 Dart 代码并生成 HTML 文档,可以使用 SDK 中的 documentation generation tool. 关于生成文档的实例,请参考 Dart API documentation. 关于文档结构的建议,请参考Guidelines for Dart Doc Comments

关键字

Dart 语言关键字列表

abstractdynamicimplementsshow
aselseimportstatic
assertenuminsuper
asyncexportinterfaceswitch
awaitextendsissync
breakexternallibrarythis
casefactorymixinthrow
catchfalsenewtrue
classfinalnulltry
constfinallyontypedef
continueforoperatorvar
covariantFunctionpartvoid
defaultgetrethrowwhile
deferredhidereturnwith
doifsetyield

避免使用这些单词作为标识符。 但是,如有必要,标有上标的关键字可以用作标识符:

  • 带有1上标 的单词为 上下文关键字, 仅在特定位置具有含义。 他们在任何地方都是有效的标识符
  • 带有2上标 的单词为 内置标识符, 为了简化将 JavaScript 代码移植到 Dart 的工作, 这些关键字在大多数地方都是有效的标识符, 但它们不能用作类或类型名称,也不能用作 import 前缀
  • 带有3上标 的单词是与 Dart 1.0 发布后添加的异步支持相关的更新,作为限制类保留字 不能在标记为 async ,async* 或 sync* 的任何函数体中使用 await 或 yield 作为标识符
  • 关键字表中的剩余单词都是保留字。 不能将保留字用作标识符