在 Visual Studio 2013 中,特殊代码(方法、属性、字段、...)的引用数量由Code Lens显示。我想在 Visual Studio中获得未使用的(零参考)代码。有没有办法得到它们?
5 回答
实现您所追求的最好和最简单的方法可能是使用带有 Visual Studio 的内置代码分析工具来查找并直接将您带到死代码和未使用的成员。
为此,我创建了一个新的代码分析规则集文件(通过File->New->File,确保选择了左窗格中的General并向下滚动以找到Code Analysis Rule Set,给它一个文件名,然后搜索和选择以下规则)。请参阅下面的规则集文件的内容,您可以将其复制并粘贴到扩展名为 .ruleset 的新文件中以供使用。
给定一个规则集文件,可以在“解决方案资源管理器”面板中右键单击项目文件,然后选择“属性” 。在项目属性窗口中,单击左侧面板中的代码分析选项卡,然后单击打开以浏览到 .ruleset 文件的位置。如果您转到解决方案文件(而不是项目文件)的属性,您可以在一个地方为解决方案中的每个项目设置代码分析文件(在Code Analysis Settings下,并使用下拉菜单选择规则集文件。注意:您之前必须浏览到规则集文件,它才会显示在此属性窗口的下拉列表中)。
然后,您只需对项目/解决方案运行代码分析(通过分析- >在解决方案上运行代码分析-或- Alt+F11),它会以警告、任何未引用的方法或找到的未使用成员的形式返回。它甚至会找到被方法引用的方法,而该方法本身在其他地方没有引用。
但是要小心,因为死代码的代码分析可能会导致您出错的一种方式是,如果仅通过委托调用该方法,当然还有反射,引用是否被“隐藏”。
具体来说,检测死代码的规则是:
- 未从任何其他代码调用的私有方法 (CA1811)
- 未使用的局部变量 (CA1804)
- 未使用的私有字段 (CA1823)
- 未使用的参数 (CA1801)
- 未从任何其他代码 (CA1812) 实例化的内部类。
- 按位或受限开关 (C6259) 中的死代码
以下是 .ruleset 文件的内容,您可以按照上述步骤获得,以方便您使用。您可以简单地复制下面的 XML,将其粘贴到 notepad++ 中,使用扩展名.ruleset保存在某处,然后按上述说明浏览并使用:
<?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>
我会浏览每个文件,使用 Ctrl-MO 命令折叠所有内容,然后滚动查找参考 0。
在 Visual Studio | 错误列表选项卡 | 消息选项卡:消息 IDE0051 私有成员 'xxxxxxxx' 未使用。
https://scottlilly.com/c-code-quality-improvement/remove-unused-classes-properties-and-functions/
“不幸的是,[在 Visual Studio 分析中],您只能检测未使用的私有成员。这是因为代码分析器假定公共成员可能被其他程序使用。如果您通过 Web 服务将它们作为 API 发布,则可能是这样或将您的代码作为库发布。... ReSharper 具有类似的代码分析功能——具有检查未使用的公共成员的优势。”
这是我用来查找标记为公共的未使用类的手动方法。
- 为您的解决方案中的一个项目搜索并替换所有“公共课程”为“私人课程”。可能还需要替换“公共静态类”和/或“公共抽象类”。
- 构建以查找所有错误
- 对于构建中的每个错误,使用您的源代码管理来恢复引用类的文件。
- 对每个错误重复,直到构建成功。
- 任何尚未恢复的剩余文件都可能被删除。
- (可选)重命名上述文件中的类并再次构建以查找错误。
- 最后一次搜索要删除的类的名称,以确认在反射或魔术字符串中没有使用它的任何实例。
- 删除已识别的未使用的类文件。
- 对要清理的每个解决方案项目重复此操作。
注意:如果你不遵循每个文件一个类的规则,这将需要更多的工作。此外,任何 API 服务端点都需要验证它没有被任何外部项目使用。