是选择一个空的可空容器还是一个空的非空容器,可以令人信服地解决。
一个类似的问题似乎很难用同样的论证来回答。很可能两种选择都是开放的。
因此要回答这个问题,你可以从三个位置中选择一个。
我们都很熟悉(在c++, Java,…中)链表中的指针的概念。在这种情况下,指针必须为空。这是我们到达列表末尾的信号。
在Dart的语法中,我们写成Item? next
。"pointer"然后next
是可空的,并将指向一个续作。重要的是,如果没有(在列表的末尾),则值null
被用作合法且非常清晰的信号量来表示。
更简单的String
的情况呢?它总是清楚,一个空的非空字符串比一个空和空字符串更好?反之亦然吗?这个问题很可能是基于意见的,这本身就是一个答案。(但这需要争论。)很可能一种情况在某些情况下更好,而另一种情况在其他情况下更好。
每个Employee
都有名字,但不一定是老板。至少CEO没有。
我们有两个选择。我们可以在使用String?
时捏鼻子,并通过写String boss
class Employee {
String name;
String boss;
}
但这意味着boss
有时会是一个空字符串。
或者我们可以用String?
class Employee {
String name;
String? boss;
}
和捏鼻子继续使用null
来表示没有老板。
一个空的不可空字符串和一个空且可空的字符串哪个更好?这是一个可以以某种方式解决的风格问题吗?
您应该使用null
来指示可选的数据,这样您可以让Dart类型系统帮助您确保在没有首先检查该值是否已定义之前不会直接使用该值。
使用空字符串是不明智的,因为你会在某些时候忘记检查空字符串,并在你的应用程序中得到一个运行时错误(或未定义的行为),这可以通过使用nullable类型来防止。
通常应该重复:使用null
是完全可以的。Dart中的null安全与摆脱null
无关,而是跟踪null
在哪里可能是一个值,并帮助我们确保检查null
在什么地方重要,只有在什么地方实际上是可能的。