我必须重构一个大型的c#应用程序,我发现了许多从未使用过的函数。我如何检查未使用的代码,所以我可以删除所有未使用的函数?
当前回答
正如Jeff指出的,NDepend工具可以帮助找到未使用的方法、字段和类型。
为了详细说明,NDepend提议在LINQ查询上编写代码规则(CQLinq)。大约提出了200个默认代码规则,其中3个用于检测未使用/死亡的代码
基本上,这样一个检测未使用方法的规则如下:
// <Name>Dead Methods</Name>
warnif count > 0
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m
但是这个规则很幼稚,会返回微不足道的假阳性。有很多情况下,一个方法从未被调用,但它并没有被使用(入口点,类构造函数,终结器……)这就是为什么3个默认规则更详细:
潜在的死亡类型(因此检测未使用的类,结构,接口,委托…) 可能死亡的方法 潜在的死亡领域
NDepend集成在Visual Studio 2022年、2019年、2017年、2015年、2013年、2012年、2010年,因此这些规则可以在IDE中检查/浏览/编辑。该工具还可以集成到CI流程中,它可以构建报告,显示违反的规则和罪魁祸首代码元素。NDepend也有一个VS团队服务扩展。
如果您点击上面指向这些规则源代码的这3个链接,您将看到有关类型和方法的内容有点复杂。这是因为它们不仅检测未使用的类型和方法,而且还检测仅由未使用的死类型和方法使用的类型和方法(递归)。
这是静态分析,因此规则名中有前缀potential。如果一个代码元素仅通过反射使用,这些规则可能认为它未使用,但事实并非如此。
除了使用这3条规则之外,我还建议通过测试来衡量代码覆盖率,并努力实现完全的覆盖率。通常,您会看到测试无法覆盖的代码实际上是可以安全丢弃的未使用/死亡代码。这在不清楚代码分支是否可达的复杂算法中特别有用。
免责声明:我为NDepend工作。
其他回答
FXCop是一个代码分析器…它的功能远不止查找未使用的代码。我用了FXCop一段时间,对它的建议太着迷了,所以我把它卸载了。
我觉得NDepend看起来更有可能。
Resharper是好的,就像其他人所说的。但是要注意,这些工具不会找到反射使用的代码,例如不能知道某些代码没有被反射使用。
这是一个很好的问题,但请注意,你正在踏入危险的水域。当你删除代码时,你必须确保你经常编译和测试。
我想到了一个很棒的工具:
NDepend - this tool is just amazing. It takes a little while to grok, and after the first 10 minutes I think most developers just say "Screw it!" and delete the app. Once you get a good feel for NDepend, it gives you amazing insight to how your apps are coupled. Check it out: http://www.ndepend.com/. Most importantly, this tool will allow you to view methods which do not have any direct callers. It will also show you the inverse, a complete call tree for any method in the assembly (or even between assemblies).
无论你选择什么工具,都不能掉以轻心。特别是当你在处理库类型程序集上的公共方法时,因为你可能永远不知道应用程序什么时候引用了它们。
ReSharper在寻找未使用的代码方面做得很好。
在VS IDE中,你可以右键单击定义并选择“查找全部” 引用,尽管这只适用于解决方案级别。
正如Jeff指出的,NDepend工具可以帮助找到未使用的方法、字段和类型。
为了详细说明,NDepend提议在LINQ查询上编写代码规则(CQLinq)。大约提出了200个默认代码规则,其中3个用于检测未使用/死亡的代码
基本上,这样一个检测未使用方法的规则如下:
// <Name>Dead Methods</Name>
warnif count > 0
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m
但是这个规则很幼稚,会返回微不足道的假阳性。有很多情况下,一个方法从未被调用,但它并没有被使用(入口点,类构造函数,终结器……)这就是为什么3个默认规则更详细:
潜在的死亡类型(因此检测未使用的类,结构,接口,委托…) 可能死亡的方法 潜在的死亡领域
NDepend集成在Visual Studio 2022年、2019年、2017年、2015年、2013年、2012年、2010年,因此这些规则可以在IDE中检查/浏览/编辑。该工具还可以集成到CI流程中,它可以构建报告,显示违反的规则和罪魁祸首代码元素。NDepend也有一个VS团队服务扩展。
如果您点击上面指向这些规则源代码的这3个链接,您将看到有关类型和方法的内容有点复杂。这是因为它们不仅检测未使用的类型和方法,而且还检测仅由未使用的死类型和方法使用的类型和方法(递归)。
这是静态分析,因此规则名中有前缀potential。如果一个代码元素仅通过反射使用,这些规则可能认为它未使用,但事实并非如此。
除了使用这3条规则之外,我还建议通过测试来衡量代码覆盖率,并努力实现完全的覆盖率。通常,您会看到测试无法覆盖的代码实际上是可以安全丢弃的未使用/死亡代码。这在不清楚代码分支是否可达的复杂算法中特别有用。
免责声明:我为NDepend工作。
推荐文章
- 防止在ASP中缓存。NET MVC中使用属性的特定操作
- 转换为值类型'Int32'失败,因为物化值为空
- c#中有任何连接字符串解析器吗?
- 在Linq中转换int到字符串到实体的问题
- 是否可以动态编译和执行c#代码片段?
- 创建自定义MSBuild任务时,如何从c#代码获取当前项目目录?
- MSBuild路径
- c#和Java的主要区别是什么?
- 在c#中创建一个特定时区的DateTime
- .NET中的属性是什么?
- csproj文件中的“Service Include”是干什么用的?
- 如何使用try catch进行异常处理是最佳实践
- 替换字符串中第一次出现的模式
- .NET中字节的字面后缀?
- 如何处理AccessViolationException