Dart null safety是什么?为什么过去不支持?

发布时间:Invalid Date
发布人:virskor
查看:5次

实际上很多语言都引入了null safety这个概念,特别是现代的编程语言。用一句话来说就是防止空指针错误,从编译的角度来看,也可以大幅度提高程序的运行性能,某些层面来看这是因为将运行时检查的逻辑,交给了语法检查器。

Dart null safety是Dart编程语言中的一个重要特性,它为开发者提供了一种更安全的方式来处理可能为null的对象。Dart null safety的主要作用是防止空指针不同寻常(Null Pointer Dereference),最终减少程序错误,提高代码的可维护性和可读性。

在传统的C++或Java等语言中,处理可能为null的对象需要额外的检查和代码,这可能会导致代码复杂性和冗余。可是在Dart中,空值(null)是一种明确的可能状态,它不需要显式的检查和空值处理机制,这使得代码更加简洁和易于理解。

Dart null safety的一个主要优点是它可以帮助开发者防止NullPointerException。在处理可能为null的对象时,如果开发者不小心访问了null对象,就会导致NullPointerException,这可能会导致程序崩溃或者产生未定义的行为。而使用Dart null safety,开发者可以更加自信地处理可能为null的对象,因为编译器会强制执行空值的安全性检查,只有在合适的情况下才允许访问null对象。

除了安全性之外,Dart null safety还可以提高代码的可维护性和可读性。在传统的编程风格中,为了处理可能为null的对象,开发者通常需要编写更多的代码来检查和处理空值。而使用Dart null safety,开发者只需要编写一次安全的代码结构,而无需为可能的null情况编写额外的检查。除此之外,由于编译器会强制执行安全性检查,代码更加清晰易懂,也更易于调试和维护。

Dart null safety是一个非常重要的特性,它为开发者提供了更安全、更简洁、更易读的代码,同时也提高了代码的可维护性和可读性。在未来的软件开发中,我们相信Dart null safety将继续发挥重要作用,并帮助我们编写更加可靠、可维护和高效的代码。

在使用AI特征时,Dart null safety也可以发挥重要作用。因为AI模型的输出可能会存在不确定性和噪声,如果不对这些输出进行适当的处理和验证,就可能会引入空值和潜在的错误。使用Dart null safety可以帮助我们更好地管理这些不确定性,确保我们的代码在处理AI输出时更加安全和可靠。

自 Dart 2.0 替换了静态可选类型系统为 完善的静态类型系统 后,空安全是我们对 Dart 作出最大的改变。在 Dart 初始之际,编译时的空安全是一项少有且需要大量时间推进的功能。直到今日,Kotlin、Swift、Rust 及众多语言都拥有他们自己的解决方案,空安全已经成为 熟视无睹的话题。

总结来说就是, Null 已不再被看作所有类型的子类

实际上Null并不会因为这样变得不再有用,反而更有作用。所以我们仍然需要合理地处理它。可选参数就是非常好的例子。叫我们来看下这段空安全的代码:

// Using null safety:
makeCoffee(String coffee, [String? dairy]) {
  if (dairy != null) {
    print('$coffee with $dairy');
  } else {
    print('Black $coffee');
  }
}

此处我们希望 dairy 参数能传入任意字符串,或者一个 null 值。为了表达我们的想法,我们在原有类型 String 的尾部加上 ? 使得 dairy 成为可空的类型。本质上,这和定义了一个原有类型加 Null 的 组合类型 没有什么区别。所以如果 Dart 包含完整的组合类型定义,那么 String? 就是 String|Null 的缩写。


使用可空类型

要是你的表达式可能返回空值,你会如何处理它呢?由于安全是我们的原则之一,答案其实所剩无几。因为你在其值为 null 的时候调用方法将会失败,所以我们不会允许你这样做。

dart

// Hypothetical unsound null safety:
bad(String? maybeString) {
  print(maybeString.length);
}

main() {
  bad(null);
}

如果我们允许这样的代码运行,那么它将毫无疑问地崩溃。我们只允许你访问同时在原有类型及 Null 类下同时定义的方法和属性。所以只有 toString()== 和 hashCode 可以访问。所以呢,你可以将可空类型用于 Map 的键值、存储于集合中或者与其他值进行比较,如此而已。

那么原有类型是如何与可空类型交互的呢?我们知道,将一个  空类型的值带给可空类型是一定安全的。如果一个函数接受 String?,那么向其传递 String 是允许的,不会有任何问题。在这次改动中,我们将所有的可空类型作为基础类型的超类。你也可以将 null 带给一个可空的类型,即 Null 也是现在Dart已经不在支持非健全空安全模式(也就是在支持空安全的代码中,引用非空安全的代码依旧能通过编译)。

由于部分文章来自用户发布,或者网络收集,我们无法考证原作者并及时联系。如您认为该文章或内容有侵权,请在发布后与我们取得联系删除。您可以点击网站下方的投诉举报,或者文章内页的举报图标按钮进行举报。我们会及时删除信息。部分用户创作内容可能标记版权信息,如您转载请提前联系并获得书面许可(盖章)。

最近评论

当前评论为精选或存在缓存,点击阅读更多查看最新

empty image

暂无更多数据

0