Debugging 为什么不';net中的对象引用错误异常告诉我哪个对象为空?

Debugging 为什么不';net中的对象引用错误异常告诉我哪个对象为空?,debugging,.net-4.0,nullreferenceexception,Debugging,.net 4.0,Nullreferenceexception,也许问这个问题暴露了我对这个过程的缺乏了解,但话说回来,没有更好的理由去问了 跟踪这些对象可能会令人沮丧,因为堆栈跟踪可以帮助我知道从哪里开始查找,但不知道哪个对象是空的 引擎盖下面是怎么回事?是因为变量名没有捆绑在可执行文件中吗?没有“对象标识符”。NET不可能说“标识符为xxxx的对象为空” 别担心,你将学会如何避免犯这些错误。只需将表达式分解为更小的部分,就可以找到忘记初始化的对象。您将学会在该场景中初始化它们,过一段时间,这种情况就不会再发生了。基本上您回答了自己的问题。当您编译代码时,

也许问这个问题暴露了我对这个过程的缺乏了解,但话说回来,没有更好的理由去问了

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

引擎盖下面是怎么回事?是因为变量名没有捆绑在可执行文件中吗?

没有“对象标识符”。NET不可能说“标识符为xxxx的对象为空”


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

基本上您回答了自己的问题。当您编译代码时,它将转换为中间语言(IL)。IL不像您的代码那样具有变量名,在调用方法之前,调用方法的参数会被推送到堆栈中,并且当前的方法参数和局部变量会在此处引用。我相信这是因为这种结构有助于JIT编译器生成代码

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

希望有帮助,
Rob

.NET代码经过充分优化而构建,没有调试信息:您的局部变量名消失了,一些局部变量可能已经完全消除


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

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


然后我们必须考虑,你处理的内容可能根本不在本地变量中——它可能是先前函数调用的结果,在这个函数调用中,你正在链接一个新的函数调用。我也想知道。你知道,我从来没有想过这个问题——好问题!“别担心,你将学会如何避免犯这些错误。”哈哈哈!还没有。还有谁不再犯这些错误了吗?