为什么.net中的对象引用错误异常告诉我哪个对象为null?

时间:2011-01-07 14:23:56

标签: debugging .net-4.0 nullreferenceexception

也许问这个问题背叛了我对这个过程缺乏了解,但是再一次,没有更好的理由要问!

跟踪这些可能会令人沮丧,因为堆栈跟踪可以帮助我知道从哪里开始查找,但不知道哪个对象为空。

引擎盖下发生了什么?是因为变量名称没有捆绑在可执行文件中吗?

3 个答案:

答案 0 :(得分:5)

使用完全优化而没有调试信息构建的.NET代码:您的本地变量名称已消失,某些局部变量可能已完全消除。

使用完全优化+ PDB(或完全调试)构建的.NET代码:保留了大多数局部变量名称,某些局部变量可能已被删除

没有优化+没有调试信息:局部变量名称消失了。

然后我们必须考虑到你所处理的任何东西都可能根本不在局部变量中 - 它可能是前一个函数调用的结果,你正在链接一个新的函数调用。 / p>

答案 1 :(得分:1)

基本上你回答了自己的问题。当您编译代码时,它将以中间语言(IL)进行转换。 IL没有您的代码所做的变量名称,被调用的方法的参数在调用方法之前被推送到堆栈,而current方法参数和局部变量由位置引用。我相信这是因为这种结构有助于JIT编译器生成代码。

pdb符号文件存储IL生成的代码与您的代码之间的映射。它用于告诉您代码中的哪一行调用堆栈中的每个方法调用引用。可能这里存储的信息不够详细,无法说明哪个变量为空,或者可能只是因为在执行此操作时它被认为太昂贵了。在任何情况下,如果您允许编译器优化生成的IL,则IL中的变量与代码中的变量之间可能不再存在一对一的映射。

希望有所帮助, 罗布

答案 2 :(得分:0)

没有“对象标识符”。 .NET无法说“标识符为xxxx的对象为空”。

你将学习如何不犯这些错误,不要担心。只需将表达式分解为更小的部分,您就会发现忘记初始化的对象。你会学会在那个场景中初始化它们,过了一段时间,这种情况不会再发生了。