已用VS2017 CA1811检测私有方法,如何检测未调用公共方法?
嘿,针对你想在VS2017里检测整个解决方案中未被调用的公共方法这个需求,我整理了几个实用的方法——毕竟你已经搞定了私有方法的CA1811规则,现在就差公共方法这块啦:
检测未被调用公共方法的几种方案
因为VS默认不会警告未被调用的公共方法(默认假设它们可能被外部程序集调用),但你的场景是程序集不会暴露到解决方案外,所以完全可以针对性处理:
方案1:快速手动检查(适合小规模解决方案)
- 右键点击解决方案,选择 分析 > 运行代码分析 > 针对解决方案
- 在弹出的「代码分析结果」窗口里,虽然没有专门的公共未调用方法规则,但可以结合「查找所有引用」功能批量排查:
- 选中任意公共方法,右键选查找所有引用,如果结果只有方法自身的定义(没有其他调用记录),那它就是未被使用的。
- 要是想批量扫,用Ctrl+Shift+F搜索
public关键字定位所有公共方法,再逐个验证就行——就是有点费手,适合小项目。
方案2:自定义Roslyn分析器(自动实时警告)
如果想要在编辑代码时就自动弹出警告,推荐做个自定义的Roslyn分析器:
- 先确保VS2017安装了「.NET Compiler Platform SDK」工作负载
- 新建一个「Roslyn分析器」项目,在分析逻辑里遍历所有公共方法,检查它们在整个解决方案内的引用次数:
- 只要是公共方法,且除了自身定义外没有其他调用,就触发警告
- 把分析器打包成NuGet包,安装到你的解决方案项目里,之后编译或编辑代码时就会自动检测了。
方案3:用第三方分析器包(现成工具省时间)
社区有现成的分析器能直接实现这个功能,比如SonarAnalyzer.CSharp:
- 先给项目安装这个NuGet包
- 然后在项目的
.editorconfig文件里添加配置,让它检测公共方法:
这样它就会自动扫描未被调用的公共方法,给你抛出警告了。dotnet_diagnostic.S1144.severity = warning sonaranalyzer.ruleset = { "S1144": { "Parameters": { "CheckPublicMembers": true } } }
方案4:修改CA1811的规则范围(简单但需注意误报)
CA1811默认只盯私有方法,但你可以修改它的检测范围来覆盖公共方法:
- 打开项目的代码分析规则集文件(
.ruleset) - 找到CA1811规则,右键选「编辑规则」
- 在规则属性里,把「目标成员可访问性」改成「公共」
- 保存规则集后,CA1811就会开始检测未被调用的公共方法了。
注意:这个方法可能会误报,比如用于反射调用、接口实现或者预留的API方法,这些需要你手动排除警告。
最后提醒下:不管用哪种方案,都记得排除那些特殊场景的公共方法——比如反射调用的、依赖注入容器用到的,别误删了有用的代码哦~
内容的提问来源于stack exchange,提问作者Jez
相关产品推荐
相关产品推荐

