为什么在 dart 中外部变量的 null 检查是不够的?

why is the null-check of an outer variable isn't enough in dart?

为什么下面的代码会报错?


Function? fob;

void someMethod() {
    if(fob != null) {
        fob();
    }
}

为什么这个 null 检查不够,fob(); 这里报错?在 if 检查和调用它可能再次为 null 的函数之间会发生什么?

当我为函数声明一个局部变量时,我知道这是有效的,但我只是想了解为什么 dart 会这样工作。

由于这个变量不是行内变量,我们不能确定它在检查和使用之间不会发生变化。您可能正在条件块中调用另一个函数,并且该函数将该全局变量设置为空。因此,要获得合理的 null-safety 类型提升仅适用于内联变量。

在您的情况下,您可以使用 fab?.call() 而无需检查条件块内的变量是否为空或 fab!()。阅读更多 here.

编码时不要像人一样思考!想想编译器是如何解释一段代码的。空值感知运算符旨在让我们认为(在编码时)NullPointerException 可能在 run-time 处导致。 fob(); 可以为空,所以当你尝试调用时,编译器提示我们它可以为空。所以你添加 if 条件来避免相同的情况: if(fob != null)。所以你确保它永远不会为空。但是编译器仍然认为它可以为空,因为你已经声明了它。 Function? fob; 这就是 ! 发挥作用的地方。它说编译器,“嘿,我已经确定它不会是 null 停止显示错误”。所以用“!”明智地。当且仅当您确定它不会为空时才使用 !。从字面上看,只需在使用 ! 之前进行空检查(**并非在所有情况下都需要!)。