You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:01:29