【发布时间】:2010-10-13 01:59:41
【问题描述】:
我经常听到人们谈论不可为空的引用类型如何解决如此多的错误并使编程变得如此容易。甚至 null 的创建者也称其为 billion dollar mistake,而 Spec# 引入了不可为空的类型来解决这个问题。
编辑:忽略我对 Spec# 的评论。我误解了它的工作原理。
编辑 2: 我一定是在和错误的人交谈,我真的希望有人与之争论 :-)
因此,作为少数派,我猜我错了,但我不明白为什么这场辩论有任何价值。我认为 null 是一种查找错误的工具。考虑以下几点:
class Class { ... }
void main() {
Class c = nullptr;
// ... ... ... code ...
for(int i = 0; i < c.count; ++i) { ... }
}
砰!访问冲突。有人忘记初始化c。
现在考虑一下:
class Class { ... }
void main() {
Class c = new Class(); // set to new Class() by default
// ... ... ... code ...
for(int i = 0; i < c.count; ++i) { ... }
}
哎呀。循环被静默地跳过。找出问题可能需要一段时间。
如果你的类是空的,代码无论如何都会失败。为什么不让系统告诉你(尽管有点粗鲁),而不必自己弄清楚?
【问题讨论】:
-
很高兴看到其他人喜欢 null,我还在上学,所以我只是假设我缺少一些东西。
-
处理“无价值”的方法更原则。 NULL 不包括原始类型,例如 int。类型系统最好在所有类型中一致地表示缺少值,而不是仅隐式地用于引用。请参阅 Haskell 的“Maybe”和 ML/OCaml/F# 的“选项”类型以了解它应该如何完成。
标签: null d access-violation non-nullable null-pointer