1 ? 和 ?. 和 ?? 和 ??=
(1) ? 三元运算符
条件表达式? 表达式1:表达式2 若 条件表达式 为 true, 则执行表达式1, 否则执行表达式2
int max(int a, int b) {
return a>b ? a:b;
}
(2) ?. 空检查运算符(对象)
A?.b
如果 A 等于 null,那么 A?.b 为 null
如果 A 不等于 null,那么 A?.b 等价于 A.b
class Animal {
final String name;
Animal(this.name);
}
void main() {
Animal animal = new Animal('cat');
Animal? empty = null;
print(animal?.name); // cat
print(empty?.name); // null
}
(3) ?? 空检查运算符(变量)
左边如果为空返回右边的值,这都为空则返回null
A??B 如果 A 等于 null,那么 A??B 为 B 如果 A 不等于 null,那么 A??B 为 A
void test1() {
int? a = null;
int? b = 1;
int? c = a ?? b;
print(c); // 1
}
void test2() {
int? a = null;
int? b = null;
int? c = a ?? b;
print(c); // null
}
void test3() {
int? a = null;
int? b = null;
int? c = 3;
int? d = a ?? b ?? c;
print(d); // 3
}
void main() {
test1();
test2();
test3();
}
(4) ??= 赋值空检查运算符
为空则赋值
A ??= B 如果A为null, 则把B赋值给A
2 非空断言 !
非空断言 左边一定不能为空,才能执行右边的代码,否则会抛出异常
class AA{
void getA(){
}
}
//普通写法
var aa=AA();
if(aa!=null){
aa.getA();
}
//非空断言写法
aa!.getA();
3 级联运算符 ..
class Data {
void getNum() {
print("getNum");
}
void getString() {
print("getString");
}
}
main() {
var data = Data()
..getString()
..getNum();
}
4 集合解包运算符 …
把一整个集合全部解包为一个个元素
main() {
var list1 = [1, 2, 3];
var list2 = [4, 5, 6, ...list1];
list2.forEach((element) {
print(element); // 打印:456123
});
}
5 私有构造函数 ._
class Instance{
Instance._();
}