“对象引用未设置为对象实例”:为什么.NET不能显示更多细节?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (28)

未将对象引用设置为对象的实例

为什么异常不会显示对象引用字段的名称,或者至少是它的类型?

这可能是.NET中最常见的运行时错误之一。虽然System.Exception有一个堆栈跟踪,但没有其他有用的细节。

在一年的时间里,我花了几个小时来浏览堆栈跟踪(通常在我没有写的代码中),希望从“.pdb”文件中找到一个行号,然后在代码中找到该行,即使这样往往不明显,该行上的哪个引用为空。具有参考字段的名称将非常方便。

如果System.ArgumentNullException实例可以显示方法参数的名称(“ Value can not be null。Parameter name:value ”),那么System.NullReferenceException实例当然可以包含空字段(或其包含的集合)的名称。

提问于
用户回答回答于

原因主要是导致运行时不知道何时遇到NRE。我猜测它必须回调调用堆栈并通过解析树,这将非常昂贵。

用户回答回答于

之间的区别ArgumentNullException,并NullReferenceException是,ArgumentNullException始终明确抛出像这样:

if (parameter == null)
  throw new ArgumentNullException("parameter");

快速查看ILDASM输出,局部变量确实存在于函数的IL中。但是,仍然没有API以编程方式检索这些名称。我的理解是,它会相当复杂,因为您基本上需要构建一个表示具有范围,变量,语句等函数的解析树。

它不仅仅是可以抛出的简单变量NullReferenceException,而是函数调用,属性或表达式的结果,这更加复杂。我可以相当快地相当复杂。

想象一下:

internalObject.OtherProperty = myObject.GetOtherObject().ThirdObject.SomeProperty == "value"
 ? myObject.OtherProperty
 : myObject.GetSomethingElse();

那里有多个失败点,并且建立一个表示实际上null可能会非常棘手的字符串。

扫码关注云+社区