这里将介绍 Dart 主要功能,从变量和运算符到类和库
假设您已经知道如何使用其他语言编程,学习更多 Dart 核心库, 参考 Dart 库概览
想了解更多有关语言功能的详细信息, 参考 Dart 编程语言规范
Dart 支持单行注释、多行注释和文档注释
- 提示: 打开 DartPad 可以体验 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 "...") 字符串常量 {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 语言关键字列表
避免使用这些单词作为标识符。 但是,如有必要,标有上标的关键字可以用作标识符:
- 带有1上标 的单词为 上下文关键字, 仅在特定位置具有含义。 他们在任何地方都是有效的标识符
- 带有2上标 的单词为 内置标识符, 为了简化将 JavaScript 代码移植到 Dart 的工作, 这些关键字在大多数地方都是有效的标识符, 但它们不能用作类或类型名称,也不能用作 import 前缀
- 带有3上标 的单词是与 Dart 1.0 发布后添加的异步支持相关的更新,作为限制类保留字 不能在标记为 async ,async* 或 sync* 的任何函数体中使用 await 或 yield 作为标识符
- 关键字表中的剩余单词都是保留字。 不能将保留字用作标识符