此篇介绍一下Dart语言的基础知识
说明
- Dart是Fuchsia操作系统的官方开发语言
- Dart是一门强类型语言,但同时仍然支持弱类型语言的某些特性
- Dart有自己的VM,可以像Java语言一样运行在虚拟机上,又可以被编译成Native Code直接运行在硬件上(比如Flutter)
- 在Dart中,一切皆是对象,一切数据类型均继承自Object,即使是一个整数或方法,甚至null
- Dart可以推断变量的类型,除非开发者明确表示某个变量不被指定为任何一种类型。建议使用静态类型,这样可以增强代码可读性,也方便代码分析。
- 没有指定类型的变量将会默认指定为dynamic类型
- Dart可以应用于前后端。比如可以开发客户端Web应用(Angular 2框架),同时也可以运行在服务端(借助DartVM)
- 作为库,可能包含一个或多个*.dart文件
- 在大多数情况下,所有的变量、方法和类等对外均可见,除非它们以“_”开头
- Dart提供两种运行模式:Production和Checked。默认情况下以Production方式运行,优先考虑性能,关闭类型检查和断言;而Checked模式更利于在开发阶段调试使用
- Dart支持顶级方法和顶级变量
- Dart代码分析工具可以指出警告和错误,错误分为编译错误和运行错误,编译错误会直接阻止代码运行,运行错误会在运行时抛出异常
- 代码简单示例
main(List<String> args) {
print("Hello Dart!");
}
变量
- 变量的初始化方法
var name = "XiaoWang"
print(name)
当然也可以使用String或dynamic类型,而不是用var类对name进行声明。
对于局部变量,根据代码建议风格来说,优先建议使用var来声明变量。
- 未经初始化的变量的默认值为null
常量
- 在Dart语言中,可以使用final或const关键字来声明一个常量
final weight = 60.5
final int height = 180
const int age = 17
const gender = "male"
- const声明的常量是一种编译时常量。const关键字也可以用来创建不变的值,甚至定义构造函数为const类型,即不可变对象,且任意变量都可以有一个不变的值。
// 使用const创建常量值
var intList = const[];
intList = [1, 2, 3];
虽然intList的值为常量不可变,但由于其本身声明使用了var,因此它仍然可以改变其引用。相当于:
// 使用const创建常量值
const temp = [];
var intList_2 = temp;
intList_2 = [1, 2, 3];
基本数据类型
- Dart的数值包含Int和Double两种类型。声明Double类型的变量,如果值是一个整数,则会自动转换成Double类型。
- 字符串有单引号字符串和双引号字符串。有转义符,另外可以用加号连接字符串。还有三个单引号或双引号,可以保持大段文本的原格式。
var userName = "小刚";
final welcome = "$userName,欢迎使用";
print(welcome);
- 类型转换
// String转换为int
String s = "1000";
int i = int.parse(s);
// int转换为String
int i = 1000;
String s = i.toString();
// 指定位数,输出3.14
print(3.14159.toStringAsFixed(2));
- Dart提供三种核心集合类型:
(1)列表List
var listExp = [1, "Hello", 3.14] // 列表中的元素可以混合不同类型
print(listExp.length)
print("长度为:" + listExp.length.toString())
(2)集合Set
var setExp = {'A', 'B', 'C', 1, 2, 3}
// 集合提供add()、remove()、contains()、clear()等方法
setExp.add('D')
setExp.remove('C')
print(setExp.contains(3))
setExp.clear()
// 另外还有一次性追加多个二元素的addAll()方法,以及removeAll()方法和containsAll()方法。
// 集合运算操作,有difference()、union()、intersection()等。
(3)映射Map
var mapExp = {
"a" : "aaa",
"b" : "bbb",
};
// 提供remove()方法和containsKey()判断,提供length()长度。
- Dart中的字符串是UTF-16编码的,对于超过的情况需要接入Runes类型。
- 只有一个表达式的方法,可以简单写法成:
int getInt() => 2 * getNumber();
// 这里=>等同于return,称为箭头语法
- 参数:必选参数和可选参数
(1)在参数列表中,必选参数在最前面,可选参数随后。
(2)参数在方法体中的引用方式需要使用$。
(3)在Dart中,可选参数分为可选命名参数和基于位置的参数,二者是互斥关系,不能同时出现。
// 可选命名参数示例:大括号
int getPrice({bookName : "一般图书"}) {
if (bookName == "热门图书") {
return 50;
} else {
return 10;
}
}
// 可选位置参数示例:中括号
String sayWelcome([String name = "你好"]) {
return "$name,欢迎使用";
}
- 主方法main方法返回void(即无返回值),有一个可选的参数List
。 - 检查两个方法是否相等,使用连等号(==)来判断。
- 在Dart中,如果一个方法没有声明返回类型和return语句,则默认为return null。
- 在Dart中,做除法无法整除时,会返回小数。如果只想要整数部分,可以使用“~/”。
print(9 ~/2);
- 如果两个对象均返回null,即使其类型不同,但其值相同,也是相等的。
- 类型判定运算符
(1) as 类型转换
(2) is 是指定类型
(3) is! 非指定类型 - 级联运算符
(1) 本质是一个特殊语法
(2) 写法是两个点,用于在同一对象上的连续调用
示例如:
// 原始写法
Point pExp = new Point();
pExp.setX(10);
pExp.setY(20);
pExp.setZ(30);
print(pExp.toString());
// 级联写法
print(new Point()..setX(10)..setY(20)..setZ(30)..toString())
- 条件成员访问运算符
?. 如果左边的对象不是null,则返回右边的值;反之则返回null
- 断言只在开发模式下起作用,在生产环境中无效。断言可以检查程序中某些可能出现的运行逻辑错误。
var intValue = 1000;
assert(intValue == 999); // 开发环境中看到控制台报错,在生产环境中不会收到提示
- 异常
(1) Dart语言提供了 Exception 和 Error 两类异常。还有它们的子类,还可以自定义异常类型,其中自定义的异常类型不能为空值。
throw new FormatException("Data format exception occurred");
// 抛出一个自定义的异常
throw 'custom exception';
(2) 在实际生产环境中,自定义异常通常的做法是写一个类,声明Error或Exception类中的方法。
- Catch
try {
// xxxxx
} catch (e) {
print(e.toString());
// yyyyy
}
// 捕捉不同的多种类型异常
try {
} on RangeError {
} on FormatError {
} catch(e) {
}
// 再次抛出异常使用rethrow
try {
} on RangeError {
// xxxxx
rethrow;
} catch (e) {
}
- Finally
try {
} catch (e) {
} finally {
print("done");
}