查找未使用的代码

226

我需要重构一个大型的C#应用程序,发现很多函数从未被使用。如何检查未使用的代码,以便删除所有未使用的函数?


4
可能是 What tools and techniques do you use to find dead code in .NET? 的重复问题。 - Alex Angas
6
我很惊讶这个被标记为离题,因为我在11年后发现这个问题和答案非常有用。提供的离题链接说:“...程序员通常使用的软件工具;是...”绝对与SO相关! - shelbypereira
1
12年后仍然有用。 - Sylvain Rodrigue
14年后仍然有用。 - Sylvain Rodrigue
9个回答

231

是的,ReSharper可以完成这个功能。右键单击解决方案并选择“查找代码问题”。其中之一是“未使用的符号”。这将向您显示未使用的类、方法等。


20
这很好。了解这个的人还不够多。您还需要打开“Solution Wide Analysis”才能显示出所有内容。 - mcintyre321
18
Resharper是一个很棒的工具,但我发现它在这项任务中不太可靠。我有一个公共方法,已经去除了所有引用。如果我右键单击该方法并选择“显示用法”,则没有用法,但Resharper的代码问题列表中未将其列为未使用。 - user890155
10
我们正在使用依赖注入。因此,即使未使用的类型仍在Unity中注册,所以所有东西看起来都被Resharper使用了。 - Montgomery 'monty' Jones
15
那是因为这个方法是公共的,所以这个库可以被其他不在当前解决方案中的应用程序使用。我相信它只会将未使用的内部和私有方法标记为代码问题。 - Lukazoid
3
关于依赖注入,可以看一下这里提到的Agent Mulder插件:http://blogs.jetbrains.com/dotnet/2012/08/resharper-70-plug-ins/项目主页:http://hmemcpy.github.com/AgentMulder/Agent Mulder是支持诸如Autofac、Castle Windsor、Unity等依赖注入框架的工具。由于ReSharper不知道这些容器,所以类经常被标记为未使用或未实例化。Agent Mulder告诉ReSharper这些类何时被使用,并提供从每个类到注册点的导航。 - Grzegorz Smulko
显示剩余8条评论

29

这是一个很好的问题,但要注意你在这里涉足危险领域。当你删除代码时,必须确保经常进行编译和测试。

有一个很棒的工具值得一提:

NDepend - 这个工具真是太棒了。需要一点时间来理解,然而在最初的10分钟之后,我想大多数开发者都会说“算了吧!”并删除该应用程序。一旦你对NDepend有了深入了解,它将为你提供关于你的应用程序相互耦合程度的惊人见解。请查看:http://www.ndepend.com/。最重要的是,这个工具将允许你查看没有任何直接调用者的方法。它还会向你展示完整的调用树,包括汇编中(甚至在汇编之间)的任何方法。

无论你选择哪个工具,这都不是一个轻松的任务。特别是如果你正在处理库类型汇编中的公共方法,因为你永远不知道应用程序何时引用它们。


4
警告:如果您的应用程序是asp.net,使用NDepend工具需要先编译您的网站,以便分析代码后端。NDepend无法覆盖或了解来自aspx页面的调用(例如ObjectDataSources中的方法调用)。 - Jaime

16

Resharper对于这一点很好,就像其他人所说的那样。但是要小心,这些工具无法发现通过反射使用的代码,例如不能确定某些代码是否未被反射使用。


15
作为Jeff所指出的,NDepend这个工具可以帮助查找未使用的方法、字段和类型。
更详细地说,NDepend建议编写Code Rule over LINQ Query (CQLinq)。提供了约200个默认代码规则,其中3个专门用于检测未使用/死代码
基本上,检测未使用方法的规则看起来像这样:
// <Name>Dead Methods</Name>
warnif count > 0 
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m

NDepend rule to find unused methods (dead methods)

但是这个规则是天真的,容易返回一些琐碎的误报。有很多情况下一个方法从未被调用,但它并不是未使用的(入口点、类构造函数、终结器...)。这就是为什么三个默认规则更加详细的原因: NDepend可以集成到Visual Studio 2022、2019、2017、2015、2013、2012、2010中,因此这些规则可以在IDE内部进行检查/浏览/编辑。该工具还可以集成到您的CI过程中,并生成报告以显示违反规则和罪魁祸首的代码元素。NDepend还有一个VS Team Services扩展
如果您点击上述三个链接以查看这些规则的源代码,您会发现涉及类型和方法的规则有点复杂。这是因为它们不仅检测未使用的类型和方法,还包括仅被未使用的死亡类型和方法(递归)使用的类型和方法。
这是一种静态分析,因此规则名称前缀中有"Potentially"。如果一个代码元素仅通过反射使用,这些规则可能会将其视为未使用,但实际上并非如此。
除了使用这三个规则外,我建议通过测试来衡量代码覆盖率,并努力实现全面覆盖。通常,您会发现无法通过测试的代码实际上是可以安全丢弃的未使用/死代码。这在复杂算法中特别有用,其中不清楚代码分支是否可达。
免责声明:我为NDepend工作。

嗨,我如何使用NDepend快速删除它们?我发现这只是找到了它们。 - Just a learner

6

我还想提一下,使用IOC(即Unity)可能会使这些评估结果失真。我可能犯了错误,但是通过Unity实例化的几个非常重要的类似乎没有实例化,就Resharper而言。如果我按照Resharper的建议去做,我将会遇到困难!


4

ReSharper 在寻找未使用的代码方面表现优异。

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


2

事实是工具永远不能给你100%的确定答案,但覆盖率工具可以让你得到相当不错的结果。

如果你有全面的单元测试套件,那么你可以使用测试覆盖率工具来查看在测试运行期间未执行的代码行。你仍然需要手动分析代码:要么消除你认为是死代码,要么编写测试以提高测试覆盖率。

其中一个工具是 NCover,它有一个开源前身在 Sourceforge 上。另一个选择是 PartCover

在 stackoverflow 上查看这个 答案


1

我曾经接触过AXTools CODESMART..建议你试一下。 在评论部分使用代码分析器。它会列出死亡的本地和全局函数以及其他问题。


0

FXCop是一种代码分析器...它不仅可以找到未使用的代码,还可以做更多的事情。我曾经使用FXCop一段时间,但是在其建议中迷失了方向,最终卸载了它。

我认为NDepend看起来更有可能胜任这份工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接