Flutter/Dart:空安全下obj!.property与obj?.property的区别
Dart空安全中
!和?.的核心区别 在Dart空安全机制下,当你访问可空对象的属性时,!(非空断言运算符)和?.(空条件运算符)是两种完全不同的处理方式,核心差异在于对null场景的应对逻辑:
1. 非空断言运算符 !
- 作用:直接告诉编译器「我保证这个对象绝对不是null,放心访问它的属性」
- 运行时行为:如果实际对象是null,会立刻抛出
Null check operator used on a null value错误,导致程序崩溃 - 适用场景:你能100%确认此时对象不可能为null的情况,比如已经通过
if (MyDateTime != null)做过非空判断,或者业务逻辑上能确保对象已被初始化
示例代码:
MyDateTime? myDate; // 先做非空判断,此时用!是安全的 if (myDate != null) { var dt = myDate!.myDateTime; } // 未做判断直接用!,运行时会崩溃 var dtCrash = myDate!.myDateTime; // 抛出空检查错误
2. 空条件运算符 ?.
- 作用:安全访问属性,自动处理null场景
- 运行时行为:如果对象是null,整个表达式的结果直接为null;如果对象非null,就正常返回属性值,不会抛出任何错误
- 适用场景:对象可能为null,你希望程序在null场景下继续运行,后续可以通过
??等运算符处理返回的null结果
示例代码:
MyDateTime? myDate; var dt = myDate?.myDateTime; // dt的值是null,程序正常运行 // 可结合??给默认值 var dtWithDefault = myDate?.myDateTime ?? DateTime.now();
总结
!是强制非空访问,赌对象一定不为null,赌输了就崩溃?.是安全降级访问,允许对象为null,此时返回null,程序继续运行
选择哪种写法,取决于你对对象是否为null的确定性,以及业务逻辑对null结果的接受程度。
内容的提问来源于stack exchange,提问作者Christoforos Pantazis
相关产品推荐
相关产品推荐

