"对象引用未设置为对象的实例":为什么.NET不能显示更多详细信息?

Sim*_*ick 15 .net c# vb.net

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

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

这可能是.NET中最常见的运行时错误之一.尽管System.Exception具有堆栈跟踪,但没有其他有用的详细信息.

在一年的过程中,我花了几个小时筛选堆栈跟踪(通常在我没写的代码中),希望有一个来自".pdb"文件的行号,然后在代码中查找行,即使这样,它也是通常不明显该线上的哪个引用为null.拥有参考字段的名称将非常方便.

如果System.ArgumentNullException实例可以显示方法参数的名称(" Value不能为null.参数名称:value "),那么System.NullReferenceException实例肯定可以包含null字段的名称(或其包含的集合).

Igo*_*aka 6

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

if (parameter == null)
  throw new ArgumentNullException("parameter");
Run Code Online (Sandbox Code Playgroud)

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

更复杂的是,它不仅仅是可以抛出的简单变量NullReferenceException,而是函数调用,属性或表达式的结果.我可以很快地变得非常复杂.

想象一下:

internalObject.OtherProperty = myObject.GetOtherObject().ThirdObject.SomeProperty == "value"
 ? myObject.OtherProperty
 : myObject.GetSomethingElse();
Run Code Online (Sandbox Code Playgroud)

那里有多个失败点,并建立一个表示实际上null可能很棘手的字符串.


Sam*_*ron 2

此处已对此进行了介绍:当抛出 NullReferenceException 时检测目标对象是什么

这里:为什么空引用异常不能命名具有空引用的对象?

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