本节主要记录和Java用法有明显差异的操作符。包括
- 类型判定操作符
- 赋值操作符
- 条件表达式
- 级联操作符
- 安全操作符
类型判定操作符
-
as
、is
和is!
操作符是在运行时判定对象类型的操作符 -
as
用于类型转换,把对象转换为特定的类型,如果无法完成转换会抛出一个异常 -
is
如果对象是指定的类型返回 true ,类似Java中的instanceOf()
-
is!
如果对象是指定的类型返回false
void main() {
//操作符 类型转换
var i = 10;
//不同于Java的(int)强转
int j = i as int;
//不同于java的instanceOf()
if (i is int) {
print(i);
}
//如果i不是整型
if (i is! int) {
print(i);
}
}
赋值操作符
1.=
、+=
、\=
、*=
等赋值操作符与Java使用一致
2.??=
操作符用来指定值为 null 的变量值
void main() {
var s1, s2;
//保证s1不为null
if (null == s1) {
s1 = "Juice";
}
//s2为null时,赋值Juice,不为null时不执行操作
s2 ??= "Juice";
print(s1);
print(s2);
}
以上两种输出结果都是Juice,??=
更简便一些
条件表达式
-
condition ? expr1 : expr2
三目表达式用法和Java一致 -
expr1 ?? expr2
表示expr1
不为null
,返回其值,否则执行expr2
并返回其结果。
void main() {
var k;
var result = k ?? "Juice";
print(result);
}
输出结果为Juice
级联操作符
级联操作符 (..
) 可以在同一个对象上连续调用多个函数以及访问成员变量。
void test() {
Builder builder = new Builder();
builder
..A()
..B()
..C();
}
class Builder {
void A() {
print("这是方法A");
}
String B() {
var k = "这是方法B";
print(k);
return k;
}
void C() {
print("这是方法C");
}
}
输出结果.png
按照Java写法,A() B() C()
三个方法返回值需要改为Builder对象,才能实现链式调用,但在Dart中可以通过级联操作符 ..
直接实现(但是B()
方法返回值会被忽略)。
安全操作符
?.
操作符,如果操作对象为null
,则返回 null
void test1() {
String a;
//空指针异常
//print(a;.length);
//如果a为null,则返回null
print(a?.length);
}
输出结果为null
网友评论