language-agnostic - 默认情况下,面向对象编程语言中的引用应该是不可空的吗?

标签 language-agnostic null language-design nullable

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。




8年前关闭。




空指针被描述为“billion dollar mistake”。某些语言具有无法分配空值的引用类型。

我想知道在设计一种新的面向对象语言时是否应该默认行为是为了防止引用被赋值为空。然后可以使用 的特殊版本来覆盖此行为。例如:

MyClass notNullable = new MyClass();
notNullable = null; // Error!
// a la C#, where "T?" means "Nullable<T>"
MyClass? nullable = new MyClass();
nullable = null; // Allowed

所以我的问题是,是否有任何理由不在新的编程语言中执行此操作?

编辑:

我想补充一点 a recent comment on my blog指出不可空类型在数组中使用 b 时有一个特殊的问题。我还要感谢大家的有用见解。这很有帮助,抱歉我只能选择一个答案。

最佳答案

我认为默认情况下不可为空引用类型的主要障碍是编程社区的某些部分更喜欢创建-设置-使用模式:

x = new Foo()
x.Prop <- someInitValue
x.DoSomething()

重载构造函数:
x = new Foo(someInitValue)
x.DoSomething()

这使得 API 设计人员无法确定实例变量的初始值,否则这些初始值可能为 null。

当然,就像 'null' 本身一样,create-set-use 模式本身会创建许多无意义的对象状态并阻止有用的不变量,因此摆脱这种情况确实是一种祝福而不是诅咒。然而,它确实以一种许多人不熟悉的方式影响了一些 API 设计,因此它不是一件容易做的事情。

但总的来说,是的,如果有一场毁灭所有现有语言和编译器的大灾难,人们只能希望我们重建时不会重蹈覆辙。可空性是异常(exception),而不是规则!

关于language-agnostic - 默认情况下,面向对象编程语言中的引用应该是不可空的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1830466/

相关文章:

java - 在 Java 中避免 != null 有什么好处?

oop - 为什么 Rust 不支持特征对象向上转换?

math - 在一组相交中找到所有四边形

language-agnostic - "program to an interface"是什么意思?

php - 为什么null可以写成反斜杠?

ruby - 为什么 Ruby 有 TrueClass 和 FalseClass 而不是单一的 Boolean 类?

c# - 为什么我们必须命名接口(interface)方法参数?

language-agnostic - 编码为通用时编码与使用存在类型

查找字符串中最常见子串的算法

function - 对于获取对象但可能找不到它的函数,最好的 func 签名是什么?