Jus*_*gan 10 c# debugging resharper nullreferenceexception visual-studio
我正在为MVC Web应用程序编写单元测试,并且我一直在获取null引用异常,因为模拟的测试对象只是部分初始化.我知道哪一行抛出异常,它看起来像这样:
return Supervisor.RegistrationInformation.Registrations
.Any(r =>
r.RegistrationCountry.IsUSAOrCandada() &&
(!DatesWorked.Start.HasValue || r.RegistrationDate <= DatesWorked.Start.Value) &&
(!DatesWorked.End.HasValue || r.RegistrationExpirationDate >= DatesWorked.End.Value) &&
//...
Run Code Online (Sandbox Code Playgroud)
那里有很多参考文献,其中任何一个都可能是问题所在.然而,NullReferenceException它本身似乎没有捕获哪个引用爆炸.我传入lambda的事实提出了另一个挑战:据我所知,我无法在调试期间单步执行lambda并查看哪些成员为rnull.
有什么方法可以做到以下一个或两个:
NullReferenceException?Any?我觉得必须有办法做这些事情,但我似乎无法找到它.我使用的是VS2010 Premium,我安装了Resharper,VS Power Tools和其他一些扩展程序.如果有一个附加组件可以做到这一点,我会很好.
正如Eric Lippert指出的那样,当代码在Release配置中编译时,无法确定NR异常的来源.我只是询问在调试模式下工作.如果Visual Studio(或VS的某些扩展)可以在调试时跟踪引用的来源,那将回答我的问题.
第二个问题 - 如何打破和逐步通过一个lambda - 已经得到了回答,但我仍然想知道是否有一种自动方法来追踪空引用.
Eri*_*ert 17
通常没有办法做你想做的事,不.要了解原因,请考虑抛出空引用异常时发生的情况.想象一下你是编译器,你必须发出代码来处理对abc.Def.Ghi.Jkl()的调用,其中abc是本地的,Def和Ghi是引用类型的字段,而Jkl是一个方法.没有IL指令可以做一些复杂的事情; 你必须打破它.因此,您为相同的程序发出代码,其中一切都更简单.您发出程序片段:
temp1 = abc.Def;
temp2 = temp1.Ghi;
temp2.Jkl();
Run Code Online (Sandbox Code Playgroud)
假设temp2为null,因为Ghi为null.在调用Jkl之前不会发现这个事实,此时抛出异常的事情并不知道temp2是如何初始化的.这发生在很久以前,过去一纳秒,机器代码没有过去的记忆; null引用没有在它上面留下一个说明null来自何处的注释,就像你说"a = b + c"时一样,得到的数字12并没有保留一条说明"我是b和c之和".
| 归档时间: |
|
| 查看次数: |
3177 次 |
| 最近记录: |