如何以编程方式识别使用C#的方法引用的数量

Duf*_*ffy 5 c# refactoring

我最近继承了需要修剪和清理的C#控制台应用程序.简而言之,该应用程序由一个包含超过110,000行代码的类组成.是的,一个班级超过110,000行.而且,当然,该应用程序是我们业务的核心,运行'全天候更新动态网站上使用的数据.虽然我被告知我的前任是"一个非常优秀的程序员",但显然他根本没有进入OOP(或版本控制).

无论如何......在熟悉代码的同时,我发现了许多声明的方法,但从未引用过.看起来好像使用了复制/粘贴来对代码进行版本化,例如说我有一个名为getSomethingImportant()的方法,很可能还有另一个名为getSomethingImortant_July2007()的方法(在大多数情况下,模式是functionName_ [datestamp]).看起来当程序员被要求对getSomethingImportant()进行更改时,他会复制/粘贴然后重命名为getSomethingImortant_Date,对getSomethingImortant_Date进行更改,然后将代码中的任何方法调用更改为新方法名称,将旧方法保留为代码但从未引用过.

我想编写一个简单的控制台应用程序,它可以遍历一个巨大的类,并返回所有方法的列表,其中包含每个方法的引用次数.根据我的估计,有超过1000种方法,所以手动这样做需要一段时间.

我可以使用.NET框架中的类来检查此代码吗?或者任何其他有用的工具,可以帮助识别声明但从未引用的方法?

(旁边的问题:有没有其他人见过像这样的C#应用​​程序,一个大的类?它或多或少是一个巨大的程序过程,我知道这是我见过的第一个,至少是这个大小.)

Rom*_*ier 12

如果您只需要提取有关您班级的一些统计数据,您可以尝试使用NDepend.请注意,此工具在内部依赖Mono.Cecil来检查程序集.


Pat*_*eam 6

为了完成Romain Verdier 的回答,让我们深入了解一下 NDepend 可以为您带来什么。(免责声明:我是 NDepend 团队的开发人员

NDepend 允许使用一些 LINQ 查询来查询您的 .NET 代码。知道哪些方法调用以及由哪些其他方法调用,就像编写以下 LINQ 查询一样简单:

from m in Application.Methods
select new { m, m.MethodsCalled, m.MethodsCallingMe }
Run Code Online (Sandbox Code Playgroud)

此查询的结果以一种易于浏览调用方和被调用方的方式呈现(并且 100% 集成到 Visual Studio 中)。

NDepend 方法调用者和被调用者


还有许多其他 NDepend 功能可以帮助您。例如,您可以右键单击 Visual Studio > NDepend > 选择方法... > 使用我的方法(直接或间接) ...

NDepend Visual Studio 方法右键单击

生成以下代码查询...

from m in Methods 
let depth0 = m.DepthOfIsUsing("NUnit.Framework.Constraints.ConstraintExpression.Property(String)")
where depth0  >= 0 orderby depth0
select new { m, depth0 }
Run Code Online (Sandbox Code Playgroud)

...匹配直接和间接调用者,调用深度(1 表示直接调用者,2 表示直接调用者的调用者,依此类推)。

NDepend 间接方法调用者

然后通过单击按钮Export to Graph,您将获得枢轴方法的调用图(当然也可以相反,即由特定枢轴方法直接或间接调用的方法)。

NDepend 调用图