【问题标题】:Is there a way to check if all defined functions are called?有没有办法检查是否调用了所有定义的函数?
【发布时间】:2009-03-19 17:20:58
【问题描述】:

有没有办法确定代码中定义的每个函数是否在某处被调用?

我一直在对我的一个大型项目进行重大代码更新,我想确保从代码中删除不再使用的旧功能。

有没有比在解决方案中搜索每个函数更好的方法?

【问题讨论】:

标签: c# visual-studio-2005


【解决方案1】:

将您尝试删除的每个方法标记为Obsolete,并将IsError 设置为true。 当您将方法标记为此类时,您将收到编译错误,并且能够确定您是否可以安全地删除该方法。

    [Obsolete("Don't use this method", /* IsError */ true)]
    public void Foo () {}

【讨论】:

  • 我倾向于为我自己的内部库打开 IsError。对于其他情况,我将其关闭
  • 我也这样做。并且经常让它们像那样离开一段时间,直到我完全确定我不再需要它们为止。除非我真的完全确定我不再需要它了:p
  • @Svish:打开 IsError 有时似乎很突兀,但有时当它必须离开时,它就必须离开。
【解决方案2】:

FxCop 应该能够找到孤立/未使用的方法。我认为您要寻找的是静态分析,而不是代码覆盖率。

【讨论】:

    【解决方案3】:

    这是一种可以捕捉除反射之外的所有内容的方法。

    1. 删除方法
    2. 编译

    这似乎有点矫枉过正,但它的优点是您可以通过删除多个函数来“批量”查询。

    【讨论】:

    • 订单在这里很重要,但是?如果 A() 调用 B() 但没有调用 A(),则首先删除 B() 会产生误导,因为它不会编译。
    • @Andrew 我没说这很容易:)。
    • @JaredPar:我想,我已经从 Michael Feathers 的“有效地使用遗留代码”中读到了关于如何在没有测试的情况下重构遗留代码的过程。
    【解决方案4】:

    两个建议:

    • 根据您的开发工具,您可能会为已声明但从未调用过的函数生成警告。

    • 您可以生成链接器映射,然后将其函数列表与您直接从源生成的列表(使用grepctags?)进行比较。

    【讨论】:

      【解决方案5】:

      像 NCover 这样的代码覆盖工具?

      编辑: 这假设您对功能进行了足够的测试,并决心摆脱所有不必要的功能。 Delete-then-compile 可以工作,但不可扩展。无论如何,关键是您需要某种源分析工具(静态或运行时分析)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-25
        • 2014-12-22
        • 2019-11-17
        • 1970-01-01
        • 1970-01-01
        • 2013-01-15
        • 1970-01-01
        • 2016-08-08
        相关资源
        最近更新 更多