我知道当 aNullReferenceException
被抛出时,错误消息指出:
你调用的对象是空的。
我意识到当我尝试取消引用null
对象引用时会抛出此消息。
该错误消息暗示NullReferenceException
除了对象引用之外可能存在原因null
(可能是错误的内存地址或类似的东西)。是这样吗?
编辑:我更关心 aNullReferenceException
可能抛出的原因,而不是错误消息的措辞。错误消息的措辞正是提示问题的原因。
我知道当 aNullReferenceException
被抛出时,错误消息指出:
你调用的对象是空的。
我意识到当我尝试取消引用null
对象引用时会抛出此消息。
该错误消息暗示NullReferenceException
除了对象引用之外可能存在原因null
(可能是错误的内存地址或类似的东西)。是这样吗?
编辑:我更关心 aNullReferenceException
可能抛出的原因,而不是错误消息的措辞。错误消息的措辞正是提示问题的原因。
我怀疑它试图保持语言中立。例如,Visual Basic 程序员习惯于“无”而不是“空”。显然类型名称不是语言中立的,但至少如果消息是,那是一个开始。
我不知道如果您以某种方式尝试取消引用“坏”内存地址,您会得到这个……此时涉及到更糟糕的 CLR 错误。
另一种可能性是它试图避免声明您已将引用的值显式设置为 null - 例如,它可能只是引用类型变量的默认值。
说引用设置为 null 并不能说明需要做什么。在他们试图变得更“有用”的过程中,他们告诉您需要发生什么:对象引用需要设置为对象的实例。
我并没有真正将其解读为暗示除了引用为空之外可能还有其他原因。如果它未初始化,则会导致编译错误。最重要的是,在您尝试使用它时,该引用并未引用任何内容。
当一个对象被这样声明时:
MyClass MyObject;
它被定义为对象引用。但是,因为它为 null(并且尚未实例化),所以它没有设置为对象的实例。如果我们添加:
MyObject = new MyClass();
然后引用已设置为对象的新实例。
如果我们稍后将其设置为 null:
MyObject = null;
然后它再次处于空状态。因此,异常消息涵盖了这两种情况(未实例化或显式设置为 null)。
它是通用语言规范的一部分。看看静态方法和实例方法的区别。
静态方法属于 Type,因此不需要实例。如果您查看 IL 字节码,静态方法称为“调用”。
但是,根据定义,非静态方法是实例方法并且需要实例。IL 指令是“ callvirt ”。“call”和“callvirt”之间的主要区别在于“callvirt”检查以查看调用该方法的目标是否不为空。