如何在Visual Studio中获取零参考/未引用代码列表

222

在Visual Studio 2013中,特定代码(方法、属性、字段等)的引用数量由 Code Lens 显示。

我想获取Visual Studio中未使用的(零引用)代码。是否有任何方法可以获取它们?

我的意思是下面的引用:
“输入图像说明”/


29
我认为他希望得到所有未被引用的方法清单,而不是将特定方法的引用数量降至零。 - Jurgen Camilleri
1
是的,我想找到所有未使用的代码,包括方法、属性等。 - Nima Rostami
1
请记住,如果要确定public是否未使用,必须搜索整个代码库。但是,对于未使用的内部和私有成员,只要启用了适当的警告,代码分析就会发出警告。 - Matthew Watson
11
我真的不是故意误导...截图告诉你他正在引用哪个参考文献。如果你读了他的帖子,就会知道他想找出所有显示为0个参考文献的内容。并不难。 - Ryan
1
请注意,如果您看到“0 引用”,这并不一定意味着代码未被使用。例如,在某些情况下,LINQ 方法可能依赖于重写的 Equals 方法的存在。删除一个 0 引用的 Equals 不会导致构建错误,但是任何依赖它的方法将在运行时默默地产生错误结果。 - Tawab Wakil
显示剩余4条评论
6个回答

229

实现你想要的最好最简单的方法可能是使用Visual Studio内置的代码分析工具,以查找并直接进入死代码和未使用成员。

为此,我创建了一个新的代码分析规则集文件(通过 文件->新建->文件,确保选择左侧窗格中的常规并向下滚动以找到代码分析规则集,为其命名,然后搜索并选择下面的规则)。以下是规则集文件的内容,您可以将其复制并粘贴到具有扩展名.ruleset的新文件中以使用。

有了规则集文件,您可以右键单击解决方案资源管理器中的项目文件,然后选择属性。在项目属性窗口中,在左侧面板上单击代码分析选项卡,然后单击打开以浏览.ruleset文件的位置。如果您转到解决方案文件的属性(而不是项目文件),则可以在一个地方为解决方案中的每个项目设置代码分析文件(在代码分析设置下,并使用下拉菜单选择规则集文件。注意:您必须先浏览到规则集文件才能在此属性窗口中的下拉菜单中显示它)。

然后,您只需对项目/解决方案运行代码分析(通过 Analyze->Run Code Analysis On Solution-或- Alt + F11 ),它将返回警告,任何未引用的方法或未使用的成员。它甚至会找到被一个方法引用但自身没有其他引用的方法。

然而,要小心,死代码的代码分析可能会误导您,如果引用仅通过委托和反射来调用该方法,则该引用可能会“隐藏”。

检测死代码的规则具体如下:

  • 不从任何其他代码调用的私有方法(CA1811)
  • 未使用的本地变量(CA1804)
  • 未使用的私有字段(CA1823)
  • 未使用的参数(CA1801)
  • 不从任何其他代码实例化的内部类(CA1812)。
  • 带有按位或限制开关的死代码(C6259)

以下是可通过上述步骤获得的.ruleset文件的内容,以供您方便地复制。您可以将以下XML复制并粘贴到notepad ++中,将其保存在某个位置,并使用如上所述的方式进行浏览和使用:

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Dead Code Rules" Description=" " ToolsVersion="12.0">
  <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
    <Rule Id="CA1801" Action="Warning" />
    <Rule Id="CA1804" Action="Warning" />
    <Rule Id="CA1811" Action="Warning" />
    <Rule Id="CA1812" Action="Warning" />
    <Rule Id="CA1823" Action="Warning" />
  </Rules>
  <Rules AnalyzerId="Microsoft.Analyzers.NativeCodeAnalysis" RuleNamespace="Microsoft.Rules.Native">
    <Rule Id="C6259" Action="Warning" />
  </Rules>
</RuleSet>

46
我认为这并没有完全回答问题。主要区别在于CodeLens会告诉您整个解决方案中一个公共方法是否没有引用,这是关键。FxCop、R#和您的方法对于非公共内容都很好。 - Scott Wylie
1
@ScottWylie - 我不同意。我刚试了上面的解决方案,它没有标记未引用的公共方法。CodeLens在标记死代码、未引用的本地内容和未使用的变量方面表现出色。我认为这可以让大多数人得到他们想要的,而不需要使用第三方工具。 - mike
15
考虑一下:如果你想用批量操作找到死代码,通常不会关心私有/受保护成员,因为这些是局部问题。例如,我正在将一个包含100多个项目和10多个解决方案的500k+ LoC项目迁移到仓库模式体系结构。在迁移完一个组件后,我需要知道哪些旧接口可以删除。一些IDE(例如Eclipse)确实有工具来做这件事。灰色的本地方法并不是我的关注重点,我想要一个公共类/接口列表,在代码镜头中告诉我“0”。 - Oliver Schimmer

31
如果你的代码库足够小,并且手动操作是可行的选择,那么我会逐个文件进行处理,使用Ctrl-M-O命令将所有内容折叠起来,然后滚动查找引用0的地方。

36
对于有10,000个文件的解决方案来说不太好! - David Bond
1
耗时很长...不好。 - Himang
谢谢。对我来说效果还不错。也提醒了我代码的结构。 - Skyfish

11
在Visual Studio | 错误列表选项卡 | 消息选项卡中: 消息 IDE0051 私有成员“xxxxxxxx”未使用。

4
有用,但仅适用于私有成员,而且原帖似乎想要所有未使用的代码。 - Paul F. Wood

7

1
是的,但是难道没有选项可以做出英勇(也就是由你来承担后果)的假设,即其他程序中没有使用这些公共成员吗? - Keith Howard

5
以下是我用来查找已标记为公共类的未使用类的手动方法:
  1. 在解决方案中选择一个项目,将所有"public class"替换为"private class"。可能还需要替换"public static class"和/或"public abstract class"。
  2. 构建项目以查找所有错误。
  3. 对于每个错误,在源代码控制工具中还原引用类的文件。
  4. 重复执行第3步,直到构建成功。
  5. 任何未被还原的文件都可能是候选文件,可以考虑删除它们。
  6. (可选)重命名上述文件中的类,并再次构建以查找错误。
  7. 搜索您要删除的类的名称,以确保没有反射或魔术字符串中使用该类的实例。
  8. 删除已确定未使用的类文件。
  9. 针对您想要清理的每个解决方案项目都进行以上步骤。
注意:如果您不遵循每个文件一个类的规则,则需要更多的工作量。另外,任何 API 服务端点,您需要验证它是否被其他外部项目使用。

49
这完全不切实际。 - Don Rolling
6
在我的一个大型项目中,这个方法对我很有效,是一种解决方案。在某些情况下可能会更加困难,但我想提供这个作为一种可能性。 - Ulfius
2
我从未说过这是实用的。这只是一种查找未使用公共类的方法。编程中并不是所有东西都是实用的。 - Ulfius
12
我会点赞,因为这至少是一种可以实现我想要的目标的方法,也就是找到未使用的公共类。是的,对于大型解决方案来说,这并不切实际,即使在小型解决方案中,对于方法和字段也无法伸缩。但这是一种我可以做到的方法,而无需花费300美元/年购买Resharper。说它不可行就像说“穷人的调试器”即Debug.WriteLine不能用来解决问题一样,只是因为它不实用。但是,如果你的免费调试器不起作用,否则你需要花费数百美元,那么这确实是一个选项,我可能会有兴趣听听。 - LWChris
生活中并不是每件事都是实用的,谢谢Ulfius :P - HelloWorld
显示剩余2条评论

2
我能找到的最好解决方案是Resharper,然后您可以运行工具的分析并查找“Type member is never used”。我知道这不是理想的解决方案,但这是我能找到的最佳解决方案。

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