我们注意到,用C#(或Java)开发的软件中的许多错误都导致NullReferenceException。
为什么在语言中甚至包含了“ null”?
毕竟,如果没有“ null”,那么我就不会有错误,对吧?
换句话说,如果没有null,该语言的什么功能将无法正常工作?
“ C#父亲” Anders
Hejlsberg在他的《计算机世界》采访中谈到了这一点:
例如,在类型系统中,值和引用类型以及类型的可空性之间没有分隔。这听起来有些怪异或有点技术性,但是在C#中,引用类型可以为null,例如字符串,但值类型不能为null。拥有非空引用类型肯定会很好,因此您可以声明“此字符串永远不能为null,并且我希望编译器检查我在此处永远不能命中空指针”。
人们今天遇到的错误中有50%是在我们的平台上使用C#编码的,对于Java同样如此,它们可能是null引用异常。如果我们有一个更强大的类型系统,可以让您说“此参数永远不会为空,那么编译器请在每次调用时通过对代码进行静态分析来进行检查”。然后,我们可以消除错误类别。
Cyrus
Najmabadi,C#团队的前软件设计工程师(现在Google工作)在他的博客(1st,2nd,3rd,4th)上讨论了该主题。似乎采用非空类型的最大障碍是符号会打扰程序员的习惯和代码库。诸如70%的C#程序引用之类的东西最终可能会成为不可空的引用。
如果您真的想在C#中具有不可为空的引用类型,则应尝试使用Spec#
,它是C#扩展名,允许使用“!”。作为不可为空的符号。
static string AcceptNotNullObject(object! s)
{
return s.ToString();
}
我得到一个当我运行我的Java应用程序。典型的原因是什么?
问题内容: 我在以下一行中得到一个: 我正在打印所有值: 输出: 那我为什么要得到呢?请帮助。谢谢。完整的堆栈跟踪如下: 问题答案: 简单的答案:您在该位置没有得到NullpointerException- 至少不是根据您发布的stacktrace。Liferay的LoginAction没有原始的StrutsAction。如果您使用的是6.2 GA5,则这是引发NullpointerExcepti
问题内容: 为什么下面的代码抛出ConcurrentModificationException?JoshBloch可以避免ConcurrentModificationException。 问题答案: 使用“ for each”循环时,不能在列表上使用remove。相反,您可以使用此方法在迭代器上调用remove: 如果您实际上想用“ 200”代替每个值,或用其他值代替,则建立一个新列表可能更有意义
Java: 如果java以微弱优势击败了C和C#我不会感到惊讶,但速度快了20倍?! 文件的格式如下: 另外,我认为值得注意的是,java在NetBeans中运行时大约需要11秒(即使是在“运行”模式下,而不是在“调试”模式下)。 我也尝试编译为C++而不是C,但没有什么不同。 我对C和C#都使用VS2015。 Java: 好吧,我按照建议重新做了测试: 首先,我在C和C#中都使用了类/struc
问题内容: Ada,Pascal和许多其他语言都支持范围,这是对整数进行子类型的一种方式。范围是一个有符号整数值,范围从一个值(第一个)到另一个值(最后一个)。实现一个在OOP中执行相同操作的类很容易,但是我认为本机支持该功能可以使编译器进行其他静态检查。 我知道无法静态地验证范围内定义的变量不会“溢出”运行时(即由于输入错误),但是我认为可以做些什么。我考虑了按合同设计方法(Eiffel)和Sp
我不明白为什么下面的代码在Java中会出错: 错误发生在部分。错误有: I:\documents\netbeansprojects\testingground\src\testingground\TestClass.java:22:错误:非静态变量这不能从静态上下文引用public static final TestClass常量=new InnerClass(5);^I:\documents\n