0

我知道当 aNullReferenceException被抛出时,错误消息指出:

你调用的对象是空的。

我意识到当我尝试取消引用null对象引用时会抛出此消息。

该错误消息暗示NullReferenceException除了对象引用之外可能存在原因null(可能是错误的内存地址或类似的东西)。是这样吗?


编辑:我更关心 aNullReferenceException可能抛出的原因,而不是错误消息的措辞。错误消息的措辞正是提示问题的原因。

4

4 回答 4

5

我怀疑它试图保持语言中立。例如,Visual Basic 程序员习惯于“无”而不是“空”。显然类型名称不是语言中立的,但至少如果消息是,那是一个开始。

我不知道如果您以某种方式尝试取消引用“坏”内存地址,您会得到这个……此时涉及到更糟糕的 CLR 错误。

另一种可能性是它试图避免声明您已将引用的值显式设置为 null - 例如,它可能只是引用类型变量的默认值。

于 2011-01-17T19:38:49.550 回答
2

说引用设置为 null 并不能说明需要做什么。在他们试图变得更“有用”的过程中,他们告诉您需要发生什么:对象引用需要设置为对象的实例。

我并没有真正将其解读为暗示除了引用为空之外可能还有其他原因。如果它未初始化,则会导致编译错误。最重要的是,在您尝试使用它时,该引用并未引用任何内容。

于 2011-01-17T19:41:21.023 回答
1

当一个对象被这样声明时:

MyClass MyObject;

它被定义为对象引用。但是,因为它为 null(并且尚未实例化),所以它没有设置为对象的实例。如果我们添加:

MyObject = new MyClass();

然后引用已设置为对象的新实例。

如果我们稍后将其设置为 null:

MyObject = null;

然后它再次处于空状态。因此,异常消息涵盖了这两种情况(未实例化或显式设置为 null)。

于 2011-01-17T19:39:50.647 回答
0

它是通用语言规范的一部分。看看静态方法和实例方法的区别。

静态方法属于 Type,因此不需要实例。如果您查看 IL 字节码,静态方法称为“调用”。

但是,根据定义,非静态方法是实例方法并且需要实例。IL 指令是“ callvirt ”。“call”和“callvirt”之间的主要区别在于“callvirt”检查以查看调用该方法的目标是否不为空。

于 2011-01-17T20:01:50.093 回答