这里将介绍 Dart 相关概念
假设您已经知道如何使用其他语言编程,学习更多 Dart 核心库, 参考 Dart 库概览.
Dart 支持单行注释、多行注释和文档注释✅提示: 打开 DartPad 可以体验 Dart 的大部分语言功能 (了解更多)
重要概念
** 版本提示: Dart 2.12引入了空安全性。使用空安全需要至少2.12的语言版本.
- 所有变量引用的都是 对象,每个对象都是一个 类 的实例。数字、函数以及
null
都是对象。除去null
以外(如果你开启了 空安全), 所有的类都继承于 [Object][] 类。 - 尽管 Dart 是强类型语言,但是在声明变量时指定类型是可选的,因为 Dart 可以进行类型推断。在上述代码中,变量
number
的类型被推断为int
类型。 - 如果你开启了 空安全,变量在未声明为可空类型时不能为
null
。你可以通过在类型后加上问号 (?
) 将类型声明为可空。例如,int?
类型的变量可以是整形数字或null
。如果你 明确知道 一个表达式不会为空,但 Dart 不这么认为时,你可以在表达式后添加!
来断言表达式不为空(为空时将抛出异常)。例如:int x = nullableButNotNullInt!
- 如果你想要显式地声明允许任意类型,使用
Object?
(如果你 开启了空安全)、Object
或者 特殊类型dynamic
将检查延迟到运行时进行。 - Dart 支持泛型,比如
List<int>
(表示一组由 int 对象组成的列表)或List<Object>
(表示一组由任何类型对象组成的列表)。 - Dart 支持顶级函数(例如
main
方法),同时还支持定义属于类或对象的函数(即 静态 和 实例方法)。你还可以在函数中定义函数(嵌套 或 局部函数)。 - Dart 支持顶级 变量,以及定义属于类或对象的变量(静态和实例变量)。实例变量有时称之为域或属性。
- Dart 没有类似于 Java 那样的
public
、protected
和private
成员访问限定符。如果一个标识符以下划线 (_
) 开头则表示该标识符在库内是私有的。可以查阅 库和可见性 获取更多相关信息。 - 标识符 可以以字母或者下划线 (
_
) 开头,其后可跟字符和数字的组合。 - Dart 中 表达式 和 语句 是有区别的,表达式有值而语句没有。比如条件表达式
expression condition ? expr1 : expr2
中含有值expr1
或expr2
。与 if-else 分支语句相比,if-else
分支语句则没有值。一个语句通常包含一个或多个表达式,但是一个表达式不能只包含一个语句。 - Dart 工具可以显示 警告 和 错误 两种类型的问题。警告表明代码可能有问题但不会阻止其运行。错误分为编译时错误和运行时错误;编译时错误代码无法运行;运行时错误会在代码运行时导致 异常。
关键字
下面的表格中列出了 Dart 语言所使用的关键字。
应该避免使用这些单词作为标识符。但是,带有上标的单词可以在必要的情况下作为标识符:
- 带有上标 1 的关键字为 上下文关键字,只有在特定的场景才有意义,它们可以在任何地方作为有效的标识符。
- 带有上标 2 的关键字为 内置标识符,其作用只是在JavaScript代码转为Dart代码时更简单,这些关键字在大多数时候都可以作为有效的标识符,但是它们不能用作类名或者类型名或者作为导入前缀使用。
- 带有上标 3 的关键字为 Dart 1.0 发布后用于 支持异步 相关内容。不能在由关键字
async
、async*
或sync*
标识的方法体中使用await
或yield
作为标识符。
其它没有上标的关键字为 保留字,均不能用作标识符。
注释
Dart 支持单行注释、多行注释和文档注释。
单行注释
单行注释以 //
开始。所有在 //
和该行结尾之间的内容均被编译器忽略。
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();
*/
}
文档注释
文档注释可以是多行注释,也可以是单行注释,文档注释以 ///
或者 /**
开始。在连续行上使用 ///
与多行文档注释具有相同的效果。
在文档注释中,除非用中括号括起来,否则分析器会忽略所有文本。使用中括号可以引用类、方法、字段、顶级变量、函数和参数。括号中的符号会在已记录的程序元素的词法域中进行解析。
下面是一个引用其他类和成员的文档注释:
/// A domesticated South American camelid (Lama glama).
///
/// Andean cultures have used llamas as meat and pack
/// animals since pre-Hispanic times.
///
/// Just like any other animal, llamas need to eat,
/// so don't forget to [feed] them some [Food].
class Llama {
String? name;
/// Feeds your llama [food].
///
/// The typical llama eats one bale of hay per week.
void feed(Food food) {
// ...
}
/// Exercises your llama with an [activity] for
/// [timeLimit] minutes.
void exercise(Activity activity, int timeLimit) {
// ...
}
}
在生成的文档中,[feed]
会成为一个链接,指向 feed
方法的文档, [Food]
会成为一个链接,指向 Food
类的 API 文档。
解析 Dart 代码并生成 HTML 文档,可以使用 Dart 的 文档生成工具。关于生成文档的示例,请参考 Dart API documentation 查看关于文档结构的建议,请参考文档: Guidelines for Dart Doc Comments.。