操作符
Dart的操作符与其它语言大同小异,这里不做一一介绍,只挑出几个需要注意的来解释下。
除与整除
在“除”这件事上,Dart涉及到两个操作符,分别如下:
操作符 说明
/ 除号
~/ 除号,但是返回值为整数
上面表格已经可以大致反映了两种“除”的区别,其中/与大多数客户端和后端语言不同,他不是整除的,如下所示代码中:
var result1 = 5 / 2;
var result2 = 5 ~/ 2;
那么result1的值为2.5。
而~/才代表整除,所以reuslt2的值为2。
相等
Dart里面相等的操作符是==。
这里的==在两个对象代表同样内容的时候返回true。
如果要判断两个对象是否是同一个对象,则要使用identical()方法。
类型判定操作符
as、is和is!操作符是在运行时判定对象类型的操作符,下面表格是对这三种操作符的说明:
操作符 说明
as 类型转换
is 如果对象时指定类型则返回True
is! 如果对象时指定的类型返回False
只有当obj实现了T的接口,obj is T才是true。例如obj is Object总是true。
一个简单的例子如下:
main() {
String x = '1234';
if(x is num) {
print('1');
} else if(x is String) {
print('2');
}
}
运行结果是在控制台输出了2。
is!的作用相反,这里就不举例子了。
而as操作符是将对象转换为指定的类型,将上面代码稍作修改就可以知道这个操作符的作用:
main() {
num x = 1234;
x as int;
if(x is int) {
print('1');
} else if(x is num) {
print('2');
}
}
运行的结果就是控制台输出了1。
赋值操作符
=这个赋值操作符是最基本的赋值操作符,但Dart里面还有一个??=的赋值操作符。
这个赋值操作符的意义以一个简单的例子说明:
a ??= value;
上述例子中,如果a为null,则赋值value给a,如果a不为null,则a保持不变。
条件表达式
Dart中有两种条件表达式:
第一中也是其他语言常见的:condition ? expr1 : expr2
而第二种,是:expr1 ?? expr2(如果expr1是non-null,返回其值;否则执行expr2并返回其结果。)
级联操作符
级联操作符(..)可以在同一个对象上连续调用多个方法或访问成员变量,可以使用官方文档的一个例子来说明。
正常的代码写法如下:
var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
而使用级联操作符写法如下:
querySelector('#button') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
注意:严格来说, 两个点的级联语法不是一个操作符。 只是一个 Dart 特殊语法。
其他操作符
这里补充一个?.操作符的说明:
?.操作符为条件成员访问操作符,和成员访问操作符.类似,但左边的操作对象不能为null。如果左边的操作对象为null则返回null,否则返回右边的成员。
流程控制语句
Dart的流程控制语句有以下几种:
- if-else
- for循环
- while、do-while循环
- break和continue
- switch和case
- assert
除了assert比较少用,其他的基本和别的语言一致,这里就不细说了。
断言
断言assert可以打断代码的执行,示例代码如下:
assert(x < 10);
如果x小于10,则不会发生任何事情,但如果x大于10,断言会执行失败,会抛出一个异常AssertionError。
需要注意的是,断言只会在debug模式下生效,release模式是不会执行的。
异常
异常的写法和作用和其他语言基本是一致的,但和java不同的是,所有Dart异常都是费检查异常。
方法不一定声明了他们所抛出的异常,并且不要求你捕获任何异常。
Dart提供Exception和Error类型,和一些基于这两种类型的子类,或者你可以定义自己的异常类型。但是,Dart并不要求只能抛出这两种类型或其子类的异常,而是可以抛出任何非null的对象作为异常。
Throw
下面是一个简单的对象异常抛出示例:
throw 'x should be less than 10';
或者使用系统定义的异常:
throw new FormatException('Expected at least 1 section');
Catch
捕获异常和其他语言类似,但写法稍有不同,以下为官方文档示例:
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}
前面提到Dart提供Exception类,如果你能确定将要捕获的异常为Exception类或者他的子类,你就可以这么来写:
try {
//...
} on Exception catch (e) {
print('Unknown exception: $e');
}
或者你可以捕获所有类型异常:
try {
//...
} catch (e) {
print('Unknown exception: $e');
}
需要注意的是catch()可以带有一个或者两个参数,第一个参数为抛出的异常对象,第二个为堆栈信息:
...
} on Exception catch (e) {
print('Exception details:\n $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}
另外,还可以使用rethrow关键字重新抛出异常,但这个我个人建议一般情况下不要使用。
Finally
这个和java中的finally的意义是一样的,不管会不会抛出异常,finally块中的代码都会执行。
本文摘抄自KevinWu的博客