查找未使用的代码[关闭]


208

我必须重构一个大型的C#应用​​程序,并且发现了很多从未使用过的功能。如何检查未使用的代码,以便删除所有未使用的功能?




令我感到惊讶的是,这被列为题外话。在撰写问题11年后,我发现该问题和答案很有用。提供的脱题链接表明“……程序员常用的软件工具;并且是……”与SO!绝对相关。
shelbypereira

Answers:


218

是的,ReSharper会这样做。右键单击您的解决方案,然后选择“查找代码问题”。结果之一是“未使用的符号”。这将向您显示未使用的类,方法等。


20
这很棒。没有足够的人知道这一点。您还必须打开“解决方案范围分析”,以显示所有内容。
mcintyre321 2010年

16
Resharper是一个很棒的工具,但是我发现它对这项任务并不可靠。我有一个公共方法,其中我删除了所有引用。如果我右键单击该方法并选择“显示用法”,则没有任何方法,但是Resharper的代码问题不会将其列为未使用的方法。
user890155 2011年

9
我们正在使用依赖注入。结果,因为即使未使用的类型也仍在统一注册,所以所有内容看起来都在使用。
蒙哥马利'蒙蒂'琼斯

11
@ user890155那是因为该方法是公共的,该库可能被不在当前解决方案中的另一个应用程序使用。我相信如果不使用它,只会将内部方法和私有方法标记为代码问题。
Lukazoid12年

3
@elggarc关于依赖项注入,请查看此处提到的Agent Mulder插件:blogs.jetbrains.com/dotnet/2012/08/resharper-70-plug-ins 项目主页:hmemcpy.github.com/AgentMulder Agent Mulder —支持依赖注入框架,例如Autofac,Castle Windsor,Unity。由于ReSharper不了解这些容器,因此经常可以将类标记为未使用或未实例化。代理Mulder告诉ReSharper这些类何时被使用,并提供从每个类到注册点的导航。
Grzegorz Smulko

29

这是一个很大的问题,但请注意,您正在这里踩水。删除代码时,必须确保经常进行编译和测试。

我想到了一个很棒的工具:

NDepend-此工具非常棒。花费一些时间,在开始的10分钟后,我认为大多数开发人员只会说“拧紧它!”。并删除该应用。一旦您对NDepend有了良好的了解,它就会为您提供有关应用程序耦合方式的惊人见解。签出:http : //www.ndepend.com/。最重要的是,该工具将允许您查看没有任何直接调用方的方法。它还将向您展示程序集(甚至程序集之间)中任何方法的逆向,完整的调用树。

无论选择哪种工具,都不是一件容易的事。尤其是在处理库类型程序集上的公共方法时,您可能永远都不知道应用程序何时引用它们。


4
另一个警告,如果您的应用程序是asp.net,则需要使用NDepend进行预编译,以便您可以分析代码背后的内容,并且NDepend无法涵盖/了解来自aspx页面的调用(即ObjectDataSources和喜欢)
Jaime 2010年

16

就像其他人所说的,Resharper对此很有好处。但是要小心,这些工具不会找到反射所使用的代码,例如,无法知道反射是否未使用某些代码。


15

正如Jeff所指出的,NDepend工具可以帮助查找未使用的方法,字段和类型。

为了详细说明,NDepend建议编写基于LINQ查询的代码规则(CQLinq)。建议使用大约200个默认代码规则,其中3个专用于未使用/死代码检测

基本上,这种检测未使用方法的规则如下所示:

// <Name>Dead Methods</Name>
warnif count > 0 
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m

NDepend规则查找未使用的方法(无效方法)

但是此规则是幼稚的,并且会返回琐碎的误报。在许多情况下,永远不会调用方法,而方法却没有被使用(入口点,类构造函数,终结器...),这就是为什么对这三个默认规则进行了详细说明的原因:

NDepend集成在Visual Studio 2017、2015、2013、2012、2010中,因此可以在IDE内部检查/浏览/编辑这些规则。该工具还可以集成到CI流程中,并且可以生成报告,以显示违反规则和罪魁祸首的代码元素。NDepend还具有VS Team Services扩展

如果单击上面指向这些规则源代码的这3个链接,您会发现与类型和方法有关的链接有些复杂。这是因为它们不仅检测未使用的类型和方法,而且还检测由未使用的无效类型和方法(递归)使用的类型和方法。

这是静态分析,因此是规则名称中的潜在前缀。如果通过反射使用代码元素,则这些规则可能会将其视为未使用,情况并非如此。

除了使用这3条规则外,我建议您通过测试来衡量代码的覆盖率,并争取完全覆盖。通常,您会看到测试无法涵盖的代码实际上是可以安全丢弃的未使用/死代码。这在尚不清楚代码分支是否可达的复杂算法中特别有用。

免责声明:我为NDepend工作。


6

我还要提到,使用IOC或Unity可能会使这些评估产生误导。我可能已经犯了错误,但就ReSharper所知,通过Unity实例化的几个非常重要的类似乎没有实例化。如果我遵循ReSharper的建议,我会被抽水!


4

锐化器在查找未使用的代码方面做得很好。

在VS IDE中,您可以右键单击定义并选择“查找所有引用”,尽管这仅在解决方案级别有效。


1

事实是,该工具永远无法给您100%的肯定答案,但是覆盖率工具可以使您物有所值。

如果您考虑使用全面的单元测试套件,则可以使用测试覆盖率工具来准确查看在测试运行期间未执行哪些代码行。您仍然需要手动分析代码:消除您认为无效的代码或编写测试以提高测试覆盖率。

NCover是其中一种工具,它在Sourceforge上具有开放源代码的前身。另一种选择是PartCover

在stackoverflow上查看此答案


1

我遇到过AXTools CODESMART ..尝试一次。在评论部分使用代码分析器,它将列出无效的本地和全局功能以及其他问题。


0

FXCop是一个代码分析器...它的作用远不止是找到未使用的代码。我使用FXCop已有一段时间,但由于对它的建议迷失了方向,因此我将其卸载了。

我认为NDepend看起来更像是候选人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.