在Visual Studio中删除未使用的代码

32

关于这个问题:Remove unused references (!= "using"),我想知道是否有工具可以从Visual Studio解决方案中删除未使用的类、结构体、委托等。

场景:

我有一个未组织好的Visual Studio解决方案,其中包含数千个:

  • 本地方法导入
  • 结构体
  • 委托
  • 枚举

与其浏览每个文件,点击“查找所有引用”并确定代码是否在某处被使用,是否有任何机制可以轻松删除冗余的代码文件?

示例:

//This class contains a method called getRandomValue which returns type RANDOM
public class NativeMethods
{
    [DllImport("random.dll")]
    public static extern RANDOM getRandomValue();
}

//This is the RANDOM object as referenced by getRandomValue();
[StructLayout(LayoutKind.Sequential)]
public struct RANDOM
{
    uint a;
    uint b;
    uint c;
}

//This is redundant since nothing is referencing it.
[StructLayout(LayoutKind.Sequential)]
public struct MESSAGE
{
    IntPtr sender;
    IntPtr recipient;
    char[] mText;
}

提醒自己:

我的直觉告诉我这会很棘手,因为与Java不同的是,对象名称不必与文件名相同,并且多个对象声明可以存在于单个文件中,但在此情况下(我的情况),每个对象都在其自己的文件中声明(具有相同的名称)。


你可以考虑使用ReSharper。它为代码清理提供了很好的支持。 - Tariqulazam
3个回答

17

我昨晚尝试了Resharper(因为它说需要超过5个小时),但不知何故,早上查看时似乎已经崩溃并未能清理我的代码,不过我会进一步调查。感谢你的努力,加1分! - Matthew Layton
1
在最新版本的 Resharper(7.1.3) 中,您可以通过进入 ReSharper -> 查找 -> 优化引用来直接分析引用。 - Bill Yang
@BillYang 7.1.3现在不是最新版本。但无论如何,了解这一点总是好的! - Dmitry Khryukin
它不是免费的,特别是对于一个贫穷的国家来说,它的成本相当高。 - Sahin

12

有几个工具可供使用:

FxCop仅能找到未使用的内部和私有代码。当然,如果您确保只公开需要在程序集外部访问的代码,那么这就足够了。


我尝试了Resharper。它说执行代码清理需要超过5个小时。我不确定是否应该花费那么长时间。我猜这取决于项目的大小...无论如何,在五个小时内它在某个时候崩溃了,所以我可能需要再次执行!...但还是谢谢...+1的努力! - Matthew Layton

1

正如 @Ergwun 所指出的,工具 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 rule to find unused methods (dead methods)

但这个规则是天真的,会返回琐碎的错误。许多情况下,一个方法从未被调用过,但它并不是未使用的(入口点、类构造函数、终结器等),这就是为什么三个默认规则更为详细:

NDepend集成在Visual Studio 2022、2019、2017、2015、2013、2012、2010中,因此这些规则可以在IDE内部被勾选/浏览/编辑。该工具还可以集成到您的CI过程中,并生成报告,显示违反规则和罪魁祸首代码元素。NDepend还有一个VS Team Services扩展
如果您点击上述3个链接以查看这些规则的源代码,您会发现涉及类型和方法的规则有些复杂。这是因为它们不仅检测未使用的类型和方法,还检测只被未使用的死代码类型和方法(递归)使用的类型和方法。
这是一种静态分析,因此规则名称中有个前缀可能。如果一个代码元素仅通过反射使用,这些规则可能认为它是未使用的,实际上并非如此。
除了使用这三个规则外,我建议通过测试来测量代码覆盖率,并努力实现完全覆盖。通常情况下,您会发现无法通过测试的代码实际上是可以安全丢弃的未使用/死代码。这在复杂算法中特别有用,因为不清楚代码分支是否可达。 < p > 声明:我为NDepend工作。

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