是否可以使用静态代码验证潜在的空对象引用?

时间:2012-04-11 15:44:23

标签: c# .net-3.5 static-analysis

我想要一种方法来获取警告,当一个对象引用可能会抛出一个空引用异常时,这样我就可以为它们编写防御性代码。

我看过Resharper,但没有看到任何可以实现此目的的东西。

代码合约可能不是首发;应用程序非常庞大,并且在代码合同正式发布之前,它是用.NET 3.5编写的。

3 个答案:

答案 0 :(得分:3)

Resharper实际上确实做到了这样的事情。可能的NullReferenceExpections在IDE中以蓝色突出显示,当您将鼠标悬停在它们上时会显示工具提示。

enter image description here

Resharper然后在它自己的检查结果窗口中跟踪潜在的错误和警告(与Visual Studio的编译器错误和警告分开)。

enter image description here

答案 1 :(得分:0)

一般来说,除非你专门初始化一个对象,否则它总是有可能抛出一个空对象引用,至少就编译器而言。

为了使算法检查对象的引用是否可能为null,它必须遍历程序可以采用的每个可能路径,并且包括您可能正在使用的任何外部库中的路径。即使对于最简单的程序,这样的算法也会破坏编译器的性能。

答案 2 :(得分:0)

我反对盲目地为代码中和每个方法中可用的每个字段防御null的想法。

以下帮助我决定在哪里检查空值:

1-谁将调用您的方法?
如果一个方法是私有的并且您可以控制它的访问方式,那么我认为防止空检查是不合理的,除非它是方法逻辑的一部分,以期望空值。 如果一个方法暴露给公众(例如API),那么当然空检查应该是一个巨大的问题。

2-软件设计:
您拥有的图像正在调用method1(fromAnimalToString(animal));,由于某种原因,fromAnimalToString()永远不会返回null(尽管可能会返回一个空字符串)。
那么在这种情况下,检查method1()的正文

中的animal != null是没有意义的

3-测试:
在软件工程中,几乎不可能测试所有可能执行的场景。但是,请测试正常和替代方案,并确保流程符合预期。