“未将对象引用设置为对象的实例”
为什么异常不显示object reference字段的name,或者至少显示它的类型?
这可能是.NET中最常见的运行时错误之一,虽然System.Exception有堆栈跟踪,但没有其他有用的细节。
在一年的时间里,我花了几个小时筛选堆栈跟踪(通常是在我没有编写的代码中),希望有来自".pdb“文件的行号,然后在代码中找到该行,即使这样,通常也不清楚该行上的哪个引用是空的。拥有引用字段的名称将非常方便。
如果System.ArgumentNullException实例可以显示方法参数的值名称(“ be null。参数名称:value"),那么System.NullReferenceException实例肯定可以包含null字段(或其包含的集合)的名称。
发布于 2010-05-27 11:03:47
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
的字符串可能很棘手。
发布于 2010-05-27 10:39:02
这里已经介绍了这一点:Detecting what the target object is when NullReferenceException is thrown
这里:Why can't a null-reference exception name the object that has a null reference?
主要原因是运行时不知道何时会遇到NRE。我猜它必须返回callstack并通过解析树,这将是非常昂贵的。
发布于 2010-05-27 14:20:48
即使变量名称和类型可能存在于MSIL代码中,当MSIL为JITted时,它也不会存在于本机代码中。
在JITting期间,将这种检查添加到本机代码中将是非常低效的--本质上是当指针被解除引用时的开销。
https://stackoverflow.com/questions/2918097
复制相似问题