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); // catprint(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._();}
