我们注意到,用 C#(或 Java)开发的软件中的许多错误都会导致 NullReferenceException。
语言中包含“null”有什么原因吗?
毕竟,如果没有“null”,我就不会有 bug,对吧?
换句话说,语言中的哪些功能如果没有 null 就无法工作?
Anders Hejlsberg,“C# 之父”,刚刚在他的《计算机世界》采访 https://www2.computerworld.com.au/article/261958/a-z_programming_languages_c_/?pp=3:
例如,在类型系统中,我们没有区分值类型和引用类型以及类型的可为空性。这可能听起来有点奇怪或有点技术性,但在 C# 中,引用类型可以为 null,例如字符串,但值类型不能为 null。拥有不可为空的引用类型肯定会很好,因此您可以声明“这个字符串永远不能为空,并且我希望编译器检查我在这里永远不会遇到空指针”。
如今,人们在我们的平台中使用 C# 进行编码时遇到的错误(对于 Java 也是如此)可能是空引用异常。如果我们有一个更强大的类型系统,允许您说“这个参数可能永远不会为空,并且您的编译器请通过对代码进行静态分析来在每次调用时检查这一点”。然后我们就可以消除各类错误。
Cyrus Najmabadi,C# 团队的前软件设计工程师(现在在 Google 工作)在他的博客上讨论了这个主题:(1st http://blogs.msdn.com/cyrusn/archive/2005/04/25/411617.aspx, 2nd http://blogs.msdn.com/cyrusn/archive/2005/04/25/411630.aspx, 3rd http://blogs.msdn.com/cyrusn/archive/2005/04/26/412040.aspx, 4th http://blogs.msdn.com/cyrusn/archive/2005/04/27/412444.aspx)。
看来采用不可空类型的最大障碍是符号会扰乱程序员的习惯和代码库。 C# 程序中大约 70% 的引用最终可能会成为不可为 null 的引用。
如果你真的想在 C# 中拥有不可为空的引用类型,你应该尝试使用Spec# http://research.microsoft.com/specsharp/这是一个 C# 扩展,允许使用“!”作为不可为空的符号。
static string AcceptNotNullObject(object! s)
{
return s.ToString();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)