C# 是否有方法检查是否调用了所有已定义的函数?

C# 是否有方法检查是否调用了所有已定义的函数?,c#,visual-studio-2005,C#,Visual Studio 2005,有没有办法确定代码中定义的每个函数是否都在某个地方被调用 我一直在对我的一个大型项目进行一次重大的代码更新,我希望确保从代码中删除不再使用的旧函数 有没有更好的方法搜索解决方案中的每个函数?像NCover这样的代码覆盖工具 编辑: 这假设您有足够的功能测试,并决心消除所有不必要的功能。删除然后编译可以工作,但不可伸缩。。无论如何,关键是您需要某种源代码分析工具(静态或运行时分析)。像NCover这样的代码覆盖工具 编辑: 这假设您有足够的功能测试,并决心消除所有不必要的功能。删除然后编译可以工作

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

我一直在对我的一个大型项目进行一次重大的代码更新,我希望确保从代码中删除不再使用的旧函数


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

像NCover这样的代码覆盖工具

编辑:
这假设您有足够的功能测试,并决心消除所有不必要的功能。删除然后编译可以工作,但不可伸缩。。无论如何,关键是您需要某种源代码分析工具(静态或运行时分析)。

像NCover这样的代码覆盖工具

编辑:
这假设您有足够的功能测试,并决心消除所有不必要的功能。删除然后编译可以工作,但不可伸缩。。无论如何,关键是您需要某种源代码分析工具(静态或运行时分析)。

这里有一种方法可以捕获除反射之外的所有内容

  • 删除该方法
  • 编撰

  • 这似乎有些过分,但它的优点是可以通过删除多个函数来“批量”查询

    这里有一种方法可以捕捉除反射之外的一切

  • 删除该方法
  • 编撰
  • 这似乎有些过分,但它的优点是可以通过删除多个函数来“批量”查询

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

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

    两条建议:

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

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

    两条建议:

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

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


    使用
    iError
    设置为
    true
    将您试图删除的每个方法标记为。 当您将一个方法标记为这样时,您将得到一个编译错误,并且将能够发现是否可以安全地删除该方法

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

    使用
    iError
    设置为
    true
    将您试图删除的每个方法标记为。 当您将一个方法标记为这样时,您将得到一个编译错误,并且将能够发现是否可以安全地删除该方法

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

    不过,这里的秩序可能很重要?如果A()调用B(),但没有任何调用A(),那么首先删除B()会产生误导,因为它不会编译。@Andrew我没有说这很容易:)@JaredPar:我想,我已经从Michael Feathers的《有效地处理遗留代码》中读到了关于如何在没有测试的情况下重构遗留代码的过程。不过,顺序在这里可能很重要?如果A()调用B(),但没有任何调用A(),那么首先删除B()会产生误导,因为它不会编译。@Andrew我没有说这很容易:)@JaredPar:我想,我已经从Michael Feathers的“有效地处理遗留代码”中读到了关于如何在没有测试的情况下重构遗留代码的过程。我倾向于为自己的内部库启用iError。对于其他情况,我也不这样做。通常会让他们这样呆一段时间,直到我完全确定我不再需要他们。除非我真的非常确定我已经不再需要它了当然:p@Svish当前位置打开iError有时看起来很突兀,但有时当它必须走的时候,它必须走。我倾向于打开iError以获得我自己的内部LIB。对于其他情况,我也不这样做。通常会让他们这样呆一段时间,直到我完全确定我不再需要他们。除非我真的非常确定我已经不再需要它了当然:p@Svish当前位置打开iError有时看起来很突兀,但有时当它必须走的时候,它必须走