为什么在C#和Java中存在“null”?

2022-08-31 12:56:25

我们注意到,我们用C#(或Java)开发的软件中的许多错误会导致NullReferenceException。

为什么“null”甚至被包含在语言中是有原因的?

毕竟,如果没有“null”,我就不会有bug,对吧?

换句话说,如果没有 null,语言中的哪些功能就无法工作?


答案 1

“C#之父”Anders Hejlsberg在他的《计算机世界》采访中谈到了这一点:

例如,在类型系统中,我们没有值和引用类型之间的分离以及类型的可空性。这可能听起来有点不稳定或有点技术性,但在C#中,引用类型可以是null,例如字符串,但值类型不能为null。如果具有不可为 null 的引用类型,那肯定是很好的,这样你就可以声明“这个字符串永远不可能是 null,我希望你的编译器检查我是否永远不能在这里命中 null 指针”。

今天人们遇到的50%的错误,在我们的平台中使用C#进行编码,Java也是如此,可能是空引用异常。如果我们有一个更强大的类型系统,可以让你说“这个参数可能永远不会是空的,你的编译器请在每次调用时通过对代码进行静态分析来检查它”。然后,我们可以消除一类错误。

Cyrus Najmabadi是C#团队的前软件设计工程师(现在在Google工作),在他的博客上讨论了这个主题:(1st2nd3rd4th)。似乎采用不可为零类型的最大障碍是符号会扰乱程序员的习惯和代码库。大约70%的C#程序引用可能最终成为不可为空的引用。

如果你真的想在 C# 中具有不可为空的引用类型,则应尝试使用 Spec#,这是一个 C# 扩展,允许使用 “!” 作为不可为空的符号。

static string AcceptNotNullObject(object! s)
{
    return s.ToString();
}

答案 2

空是引用类型的自然结果。如果你有一个引用,它必须引用某个对象 - 或者为空。如果要禁止 nullity,则始终必须确保每个变量都使用一些非 null 表达式进行初始化 - 即使这样,如果在初始化阶段读取变量,您也会遇到问题。

您如何建议删除无效的概念?