2. dart ?.
dart 语法糖 ?.
它的意思是左边如果为空返回 null,否则返回右边的值。
A?.B 如果 A 等于 null,那么 A?.B 为 null 如果 A 不等于 null,那么 A?.B 等价于 A.B
Sample:
void main() {
Animal animal = new Animal('cat');
Animal empty = null;
//animal 非空,返回 animal.name 的值 cat
print(animal?.name);
//empty 为空,返回 null
print(empty?.name);
//animal 非空,可以直接访问 animal.name 的值 cat
print(animal.name);
//empty 为空,抛出异常
print(empty.name);
}
class Animal {
final String name;
Animal(this.name);
}
大家拷贝代码然后替换在线编辑器的内容,运行后会看到如下输出:
cat
null
cat
Uncaught exception:
Cannot read property 'get$name' of null
可以看到假设左边不为空,不管是使用**?.还是直接用我们熟悉的.访问变量都是没问题的。 但是如果左边为空,使用?.会返回null**。但是直接使用**.**会直接抛出异常。
3. dart ??
dart 语法糖 ??
它的意思是左边如果为空返回右边的值,否则不处理。
A??B 如果 A 等于 null,那么 A??B 为 B 如果 A 不等于 null,那么 A??B 为 A
以上面为例子,假设我们上面要求当 empty 为空时,默认值输出 unknown。
那么可以修改如下:
//empty 为空,返回 null
print(empty?.name);
改为
//empty 为空,本来要返回 null,由于有 ??,返回 unknown
print(empty?.name??'unknown');
这样就不会返回 null 而是返回 unknown。
同样的大家可以试下返回 cat 的语句如果加上这个会怎样,可以预见是不会改变的。
4. dart ?. ?? 优雅所在
这边举例说明下使用 ?. ?? 语法糖和不使用的对比。
void main() {
C c = new C('Case 1');
B b = new B(c);
A a = new A(b);
// C c = new C(null);
// B b = new B(c);
// A a = new A(b);
// C c = new C('Case 2');
// B b = null;
// A a = new A(b);
//直接使用.来最终获取 c 的变量 value
if (a != null && a.bMember != null && a.bMember.cMember != null) {
print(a.bMember.cMember.value);
} else {
print(null);
}
//直接使用.来最终获取 c 的变量 value,为空时返回 unknown
if (a != null && a.bMember != null && a.bMember.cMember != null) {
String value = a.bMember.cMember.value;
if (value == null) {
value = 'unknown';
}
print(value);
} else {
print('unknown');
}
//dart 使用?.来最终获取 c 的变量 value
print(a?.bMember?.cMember?.value);
//dart 使用?.来最终获取 c 的变量 value,为空时使用 ?? 返回 unknown
print(a?.bMember?.cMember?.value??'unknown');
}
class A {
final B bMember;
A(this.bMember);
}
class B {
final C cMember;
B(this.cMember);
}
class C {
final String value;
C(this.value);
}
这里面有三个 case,另外两个 case 暂时注释掉。
这三个 case 的结果分别为:
Case 1
Case 1
Case 1
Case 1
null unknown null unknown
null
unknown
null
unknown
```
可以看到 dart 的语法糖很优雅,一行全搞定。
#### 5\. print 方法遇到 null
下面这个例子:
```
void main() {
String a = null;
print('exception='+a);
}
```
你觉得结果是 exception=null 吗?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RETDVeV8-1630140716573)(https://user-gold-cdn.xitu.io/2019/2/23/169195a001b79256?imageView2/0/w/1280/h/960/ignore-error/1)]
结果是
```
下面这个例子:
```
void main() {
String a = null;
print('exception='+a);
}
```
你觉得结果是 exception=null 吗?
[外链图片转存中...(img-RETDVeV8-1630140716573)]
结果是
```
|