关于.net:是否有一个自定义的FxCop规则可以检测未使用的PUBLIC方法?

关于.net:是否有一个自定义的FxCop规则可以检测未使用的PUBLIC方法?

Is there a custom FxCop rule that will detect unused PUBLIC methods?

我刚刚尝试了FxCop。它会检测未使用的私有方法,但不会检测未使用的公共方法。是否有我可以下载的自定义规则,该插件将检测未从同一程序集中调用的公共方法?


Corey,我使用FxCop的答案假设您有兴趣删除未使用的私有成员,但是要解决其他情况下的问题,您可以尝试使用NDepend。这是一些CQL,用于检测未使用的公共成员(改编自下面列出的文章):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// <Name>Potentially unused methods</Name>
WARN IF Count > 0 IN SELECT METHODS WHERE
 MethodCa == 0 AND            // Ca=0 -> No Afferent Coupling -> The method
                              // is not used in the context of this
                              // application.

 IsPublic AND                 // Check for unused public methods

 !IsEntryPoint AND            // Main() method is not used by-design.

 !IsExplicitInterfaceImpl AND // The IL code never explicitely calls
                              // explicit interface methods implementation.

 !IsClassConstructor AND      // The IL code never explicitely calls class
                              // constructors.

 !IsFinalizer                 // The IL code never explicitely calls
                              // finalizers.

来源:Patrick Smacchia的"耦合,死代码,设计缺陷和重新设计的代码度量。本文还介绍了检测死字段和类型的问题。

(编辑:使答案更易于理解)

EDIT 2012年6月11日:解释有关未使用代码的新NDepend工具。免责声明:我是该工具的开发人员之一。

自2012年5月发布NDepend v4以来,该工具建议通过LINQ查询(CQLinq)编写代码规则。提出了大约200个默认代码规则,其中3个专用于未使用/死代码检测:

  • 潜在失效的类型(因此检测未使用的类,结构,接口,委托...)
  • 潜在失效的方法(因此检测未使用的方法,ctor,属性获取器/设置器...)
  • 潜在的死亡领域

这些CQLinq代码规则比以前的CQL功能更强大。如果单击上面指向这些规则源代码的这3个链接,您会发现有关类型和方法的链接有些复杂。这是因为它们不仅检测未使用的类型和方法,而且还检测仅由未使用的无效类型和方法(递归)使用的类型和方法。

这是静态分析,因此规则名称中的前缀可能。如果仅通过反射使用代码元素,则这些规则可能会将其视为未使用,情况并非如此。

除了使用这3条规则外,我建议通过测试来衡量代码的覆盖率,并力争全面覆盖。通常,您会看到测试无法涵盖的代码实际上是可以安全丢弃的未使用/死代码。这在复杂的算法中尤其有用,在这种算法中,不清楚代码的分支是否可以访问。


如果未使用方法并且公共FxCop假定您已将其公开以供外部访问。

如果未使用的公共方法导致FxCop警告,编写API之类的事情会很痛苦-您将获得打算供其他人使用的方法的FxCop警告负载。

如果不需要外部任何内容来访问程序集/ exe,请考虑使用internal替换public。您的应用程序将以相同的方式运行,FxCop将能够找到未引用的内部方法。

如果您确实需要外部访问,请找出真正需要哪些方法是外部的,并将其余所有方法都设置为内部。

您使外部可见的任何方法也可以进行单元测试。


NDepend是您这种事情的朋友


它将如何知道未使用公共方法?

通过将方法标记为公共方法,任何引用您的库的应用程序都可以访问它。


推荐阅读

    linux性能检测命令?

    linux性能检测命令?,系统,情况,信息,状态,工具,实时,百分比,指标,分析,命令,

    创建自定义命令linux?

    创建自定义命令linux?,工具,状态,命令,系统,代码,标准,数据,位置,电脑,材料,L

    linux自定义命令行?

    linux自定义命令行?,系统,工作,名称,百度,命令,管理,工具,位置,信息,终端,Lin

    linux配置自定义命令?

    linux配置自定义命令?,服务,系统,状态,策略,周期,地方,标准,新增,环境,工具,L

    linux使用命令的方法?

    linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,

    自定义命令linux命令?

    自定义命令linux命令?,工具,系统,数据,命令,新增,代理,通信,地方,信息,时间,

    linux检测硬件的命令?

    linux检测硬件的命令?,信息,系统,检测,工具,第一,数据,设备,分析,实时,百度,

    linux自定义简写命令?

    linux自定义简写命令?,系统,工作,命令,标准,地址,基础,信息,软件,目录,文件,

    linux命令简写自定义?

    linux命令简写自定义?,系统,状态,命令,代码,工具,发行,标准,软件,文件,别名,L

    linux命令超时检测?

    linux命令超时检测?,时间,网络,检测,系统,地址,状态,电脑,代码,软件,设备,lin

    linux用户自定义命令?

    linux用户自定义命令?,系统,时间,标准,软件,项目,电脑,服务,工具,基本知识,

    linux下端口检测命令?

    linux下端口检测命令?,检测,系统,状态,工具,情况,端口,网络,服务,灵活,信息,l

    linux检测摄像头命令?

    linux检测摄像头命令?,系统,工具,情况,实时,信息,状态,平均,设备,检测,数据,L

    linux检测进程命令?

    linux检测进程命令?,系统,服务,地址,状态,信息,检测,进程,命令,第一,软件,lin

    linux自定义快捷命令?

    linux自定义快捷命令?,系统,首次,位置,时间,文件,命令,链接,快捷键,终端,桌

    linux检测程序命令?

    linux检测程序命令?,地址,系统,工作,检测,命令,情况,信息,报告,状态,软件,lin

    linux坏块检测命令?

    linux坏块检测命令?,信息,系统,工具,检测,报告,管理,状态,命令,时间,盘中,lin

    linux自定义全局命令?

    linux自定义全局命令?,环境,系统,命令,别名,新增,信息,地方,文件,定义,用户,

    linux检测内存命令?

    linux检测内存命令?,情况,系统,工具,分析,信息,实时,状态,检测,内存,电脑,怎

    检测端口命令linux?

    检测端口命令linux?,系统,情况,状态,地址,检测,端口,信息,灵活,网络,服务,lin