Dart语言之旅
要了解有关Dart核心库的更多信息,请参阅Dart Library之旅。无论何时您想了解有关语言功能的更多详细信息,请参阅Dart语言规范。
一个基本的dart程序
以下代码使用了Dart最基本的许多功能:
// 定义一个函数. printInteger(int aNumber) { print('The number is $aNumber.'); // 打印到工作台 } //这是应用程序开始执行的地方. main() { var number = 42; // 声明并初始化一个变量 printInteger(number); // 调用一个函数. }
以下是适用于所有(或几乎所有)Dart应用程序的写法:
// 单行注释 //此外dart还支持多行注释和文档注释,详情见后面 int //int类型,其他一些内置类型是String,List bool 42 //数字,数字是一种编译时常量 print() //一种很方便的打印方法 '......' or"......" //这两种都是表示字符串 $variableName (or ${expression}) //字符串插值:在字符串文字中包含一个变量或表达式的字符串。有关更多信息,请参阅字符串。 main() //一个应用程序执行开始的特殊的、必须的函数,详情查看main函数 var //声明变量但不指定类型
重要概念
当你了解Dart语言时,要牢记这些事实和概念:
- 你可以放在变量中的所有东西都是一个对象,每个对象都是一个类的实例。即使是数字,功能, null也是对象。所有对象都从Object类继承。
- 虽然Dart是强类型的,但类型注释是可选的,因为Dart可以推断类型。在上面的代码中,number 被推断为是类型的int。当你想明确地说没有类型时, 使用特殊类型dynamic。
- Dart支持泛型类型,如List<int>(整数列表)或List<dynamic>(任何类型的对象列表)。
- Dart支持顶层函数(如main()),以及与类或对象绑定的函数(分别为静态方法和实例方法)。你也可以在函数中创建函数(嵌套函数或局部函数)。
- 同样,Dart支持顶级变量以及绑定到类或对象(静态变量和实例变量)的变量。实例变量有时称为字段或属性。
- 与Java,dart不具备关键字public,protected和private。如果标识符以下划线(_)开头,则它的库是私有的。有关详细信息,请参阅 库和可见性。
- 标识符可以以字母或下划线(_)开头,然后是这些字符和数字的任意组合。
- 有时候,重要的是某件事是一种表达式还是一种 声明,所以这两个词的确切含义很有帮助。
- Dart工具可以报告两种问题:warnings 和errors。警告只是表明您的代码可能无法正常工作,但它们不会阻止您的程序执行。错误可以是编译时或运行时。编译时错误导致代码无法执行; 运行时错误导致 代码执行时引发异常。
关键词
下表列出了Dart语言特别处理的关键词。
abstract | do | import | super |
---|---|---|---|
abstract1 | do | import 1 | super |
as 1 | dynamic 1 | in | switch |
assert | else | interface 1 | sync* 2 |
async 2 | enum | is | this |
async* 2 | export 1 | library 1 | throw |
await 2 | external 1 | mixin 1 | true |
break | extends | new | try |
case | factory 1 | null | typedef 1 |
catch | false | operator 1 | var |
class | final | part 1 | void |
const | finally | rethrow | while |
continue | for | return | with |
covariant 1 | get 1 | set 1 | yield 2 |
default | if | static 1 | yield* 2 |
deferred 1 | implements 1 |
1带上标1的单词是内置标识符。
避免使用内置标识符作为标识符。
如果您尝试为类或类型名称使用内置标识符,则会发生编译时错误。
2带上标2的单词是较新的,与Dart 1.0版本发布后添加的异步支持相关的有限保留字。
您不能使用async,await或yield作为用async,async 或sync 标记的任何函数体中的标识符。
有关更多信息,请参见异步支持
**关键字表中的所有其他字都是保留字。
您不能使用保留字作为标识符**
变量
以下是创建变量并初始化变量的示例:
var name ='Bob';
变量存储的是引用,命名为name的变量存储的是 值为"Bob"的字符创的一个引用
name变量的类型被推断为String,但您可以通过指定它来更改该类型。
如果对象不限于单一类型,请遵循设计指南指定对象或动态类型
dynamic name ='Bob';
另一种选择是显式声明将被推断的类型
String name = 'Bob';
默认值
未初始化的变量的初始值为null。即使数字类型的变量最初为null,因为数字 - 和Dart中的其他所有数据一样 - 都是对象。
int lineCount; assert(lineCount == null);注意:assert()产品代码中 的调用被忽略。在开发过程中, 除非条件为真,否则会引发异常。有关详细信息,请参阅Assert。assert(condition)
Final和const
如果你从不打算改变一个变量,使用final或者const,而不是var或者其他类型。最终的变量只能设置一次; 一个const变量是一个编译时常量。(Const变量隐式final 。)final的顶层或者class变量在它第一次被使用时被初始化。
注意: 实例变量可以final但不是const。以下是创建和设置最终变量的示例:
final name = 'Bob'; // 没有类型声明 // name = 'Alice'; // 取消注释会导致UC哦呜 final String nickname = 'Bobby';
将const用于想要成为编译时常量的变量。
如果const变量处于类级别,则将其标记为静态常量。
在声明该变量的位置,将该值设置为编译时常量,例如数字或字符串文字,常量变量或常数上算术运算的结果:
const bar = 1000000; // 压力单位(dynes/cm2) const double atm = 1.01325 * bar; // 标准大气压
该const关键字不只是声明常数变量。您也可以使用它来创建常量值,以及声明创建常量值的构造函数。任何变量都可以有一个常量值。
// Note: [] 创建一个空的list // const [] 创建一个空的, 一成不变的list (简写为EIL). var foo = const []; // foo 当前是一个 EIL(empty immutabe list). final bar = const []; // bar 将永远是 EIL. const baz = const []; // baz 是一个编译时常量 EIL. // You can change the value of a non-final, non-const variable, // even if it used to have a const value. foo = []; // You can't change the value of a final or const variable. // bar = []; // Unhandled exception. // baz = []; // Unhandled exception.