1 ? 和 ?. 和 ?? 和 ??=

(1) ? 三元运算符

条件表达式? 表达式1:表达式2 若 条件表达式 为 true, 则执行表达式1, 否则执行表达式2

  1. int max(int a, int b) {
  2. return a>b ? a:b;
  3. }

(2) ?. 空检查运算符(对象)

A?.b
如果 A 等于 null,那么 A?.b 为 null
如果 A 不等于 null,那么 A?.b 等价于 A.b

  1. class Animal {
  2. final String name;
  3. Animal(this.name);
  4. }
  5. void main() {
  6. Animal animal = new Animal('cat');
  7. Animal? empty = null;
  8. print(animal?.name); // cat
  9. print(empty?.name); // null
  10. }

(3) ?? 空检查运算符(变量)

左边如果为空返回右边的值,这都为空则返回null

A??B 如果 A 等于 null,那么 A??B 为 B 如果 A 不等于 null,那么 A??B 为 A

  1. void test1() {
  2. int? a = null;
  3. int? b = 1;
  4. int? c = a ?? b;
  5. print(c); // 1
  6. }
  7. void test2() {
  8. int? a = null;
  9. int? b = null;
  10. int? c = a ?? b;
  11. print(c); // null
  12. }
  13. void test3() {
  14. int? a = null;
  15. int? b = null;
  16. int? c = 3;
  17. int? d = a ?? b ?? c;
  18. print(d); // 3
  19. }
  20. void main() {
  21. test1();
  22. test2();
  23. test3();
  24. }

(4) ??= 赋值空检查运算符

为空则赋值

A ??= B 如果A为null, 则把B赋值给A

2 非空断言 !

非空断言 左边一定不能为空,才能执行右边的代码,否则会抛出异常

  1. class AA{
  2. void getA(){
  3. }
  4. }
  5. //普通写法
  6. var aa=AA();
  7. if(aa!=null){
  8. aa.getA();
  9. }
  10. //非空断言写法
  11. aa!.getA();

3 级联运算符 ..

  1. class Data {
  2. void getNum() {
  3. print("getNum");
  4. }
  5. void getString() {
  6. print("getString");
  7. }
  8. }
  9. main() {
  10. var data = Data()
  11. ..getString()
  12. ..getNum();
  13. }

4 集合解包运算符 …

把一整个集合全部解包为一个个元素

  1. main() {
  2. var list1 = [1, 2, 3];
  3. var list2 = [4, 5, 6, ...list1];
  4. list2.forEach((element) {
  5. print(element); // 打印:456123
  6. });
  7. }

5 私有构造函数 ._

  1. class Instance{
  2. Instance._();
  3. }