查找未使用的代码

我不得不重构一个大型的C#应用​​程序,我发现了很多从不使用的函数。 我怎样才能检查未使用的代码,所以我可以删除所有未使用的function?

是的,ReSharper这样做。 右键单击您的解决scheme并select“查找代码问题”。 其中一个结果是“未使用的符号”。 这将显示你没有使用的类,方法等。

这是一个很好的问题,但是要警惕的是,你正在这个危险的水域里踏步。 当你删除代码时,你必须确保你经常编译和testing。

想到一个伟大的工具:

NDepend – 这个工具简直太棒了。 这需要一点点时间,第一个10分钟后,我想大多数开发者只是说“拧它! 并删除该应用程序。 一旦你对NDepend有了一个好的感觉,它可以让你了解你的应用程序是如何耦合的。 检查出来: http : //www.ndepend.com/ 。 最重要的是,这个工具将允许你查看没有任何直接呼叫者的方法。 它也会向你展示反向的,一个完整的调用树,用于程序集中的任何方法(甚至在程序集之间)。

无论您select哪种工具,轻轻松松就不是一项任务。 特别是如果你正在处理库types程序集的公共方法,因为你可能永远不知道什么时候应用程序引用它们。

像其他人所说的,Resharper对此很有帮助。 但要小心,这些工具没有find你使用reflection的代码,例如不知道某些代码是否不被reflection使用。

正如Jeff指出的那样, NDepend工具可以帮助您find未使用的方法,字段和types。

详细一点,NDependbuild议编写代码规则LINQ查询(CQLinq) 。 提出了大约200个默认代码规则 ,其中3个专用于未使用/死码检测

基本上这样一个规则来检测未使用的方法,例如:

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

NDepend规则查找未使用的方法(死亡方法)

但这个规则是天真的,并将返回微不足道的误报。 有很多情况下,一个方法从来没有被调用,但它不是未使用(入口点,类构造函数,finaliser …),这就是为什么3个默认规则更详细说明:

  • 潜在的死types (因此检测未使用的类,结构,接口,委托…)
  • 潜在的死亡方法
  • 潜在的死亡领域

NDepend集成在Visual Studio 2017,2015,2013,2012,2010中,因此这些规则可以在IDE内部进行检查/浏览/编辑 。 该工具也可以集成到您的CI过程中,它可以构build报告 ,显示违反规则和罪魁祸首的代码元素。 NDepend也有一个VS Team Services扩展 。

如果你点击上述3条链接到这些规则的源代码,你会发现有关types和方法的有点复杂。 这是因为它们不仅检测未使用的types和方法,而且还检测由未使用的死types和方法(recursion)使用的types和方法。

这是静态分析 ,因此在规则名称中有潜在的前缀。 如果通过reflection来使用代码元素,则这些规则可能将其视为未使用,而不是这种情况。

除了使用这三条规则之外,我还build议通过testing来测量代码覆盖率并争取全面覆盖。 通常情况下,您会看到testing无法覆盖的代码实际上是未使用的/死代码,可以安全地丢弃。 在不清楚代码分支是否可达的复杂algorithm中,这是特别有用的。

免责声明:我为NDepend工作。

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

在VS IDE中,您可以右键单击定义并select“查找所有引用”,但这只能在解决scheme级别运行。

我还要提到,使用国际奥委会统一可能会使这些评估误导。 我可能犯了错误,但通过Unity实例化的几个非常重要的类似乎没有实例,只要ReSharper可以告诉。 如果我遵循ReSharper的build议,我会变得虚弱!

我遇到了AXTools CODESMART..Try那一次。 在评论部分使用代码分析器。它将列出死亡的本地和全球function以及其他问题。

FXCop是一个代码分析器…它不仅仅是find未使用的代码。 我使用了FXCop一段时间,并在build议中丢失了,所以我卸载了它。

我认为NDepend看起来更有可能成为候选人。

事实是,该工具永远不会给你一个100%肯定的答案,但覆盖工具可以给你一个相当不错的钱跑。

如果您使用全面的unit testing套件,那么您可以使用testing覆盖率工具来查看在testing运行期间不执行哪些代码行。 您仍然需要手动分析代码:或者消除您认为死代码或者编写testing以提高testing覆盖率。

一个这样的工具是NCover ,在Sourceforge上有开源的前身。 另一种select是PartCover 。

看看这个答案在stackoverflow。