C# 在VisualStudio中,是否有一种按用法对私有方法进行排序的方法?

C# 在VisualStudio中,是否有一种按用法对私有方法进行排序的方法?,c#,visual-studio,refactoring,C#,Visual Studio,Refactoring,在VisualStudio中,无论是否有扩展,是否有一种方法可以根据私有方法的使用顺序(它们在调用堆栈中的位置)自动对类中的私有方法进行排序 例如考虑以下类: public class MyClass { public void MyMethod() { TestC(); } private void TestA() { TestB(); } private void TestB() {

在VisualStudio中,无论是否有扩展,是否有一种方法可以根据私有方法的使用顺序(它们在调用堆栈中的位置)自动对类中的私有方法进行排序

例如考虑以下类:

public class MyClass
{
    public void MyMethod()
    {
        TestC();
    }

    private void TestA()
    {
        TestB();
    }

    private void TestB()
    {
        Console.WriteLine("Hello");
    }

    private void TestC()
    {
        TestA();
    }
}
这个类中的公共方法是
MyMethod
,它调用
TestC
,后者调用
TestA
,后者调用
TestB
。我想(自动)按此顺序对这些方法进行排序,使类看起来像这样:

public class MyClass
{
    public void MyMethod()
    {
        TestC();
    }

    private void TestC()
    {
        TestA();
    }

    private void TestA()
    {
        TestB();
    }

    private void TestB()
    {
        Console.WriteLine("Hello");
    }
}
我需要能够选择一个类,请求这样的方法排序,并让方法自动排序。也就是说,我不想手动排序这些方法

我理解其中有一些细微差别。例如,可能有一个私有方法是从调用堆栈中处于两个不同级别的两个方法调用的。我想在这种情况下,考虑最小的(调用堆栈)与公共方法的距离是有意义的。 更新:

以这种方式对方法进行排序的想法来自Robert C.Martin的干净代码书。在第三章中,我们定义了逐步下降规则,即在低级函数之前出现高级函数

我在google上快速搜索了一条降压规则,在以下位置找到了一个netbeans插件:


我想它的功能与我所需要的类似,但是对于netbeans。

我不知道是否可以在Visual Studio中以本机方式实现这一功能。然而,我认为最好的方法是使用ReSharper(一个visualstudio扩展)来实现这一点

它提供了至少两个想到的选项:

1) 将首选项与模式一起使用

2) 使用“文件结构”窗口(如果要重新排序的类没有太多方法,这可能是最快的方法)。你可以


希望能有所帮助。

如果您想手动触发该逻辑并使用vs 2015,您可以创建一个使用Roslyn的visual studio代码修复程序。 见:

您应该执行的步骤包括:

  • 创建代码修复项目
  • 使用Roslyn的代码修复逻辑将分析文档中的所有方法,并在这些方法之间创建依赖关系图。然后它将更改顺序并将代码重写到文档中
  • 作为分析器安装CodeFix,并将其用于所需的每个visual studio文档
  • 简言之,答案是否定的 原因很简单,因为大多数开发人员都试图编写易于阅读的代码。如果我需要更新TestB并查看代码,我希望TestB在TestA之后和TestC之前定义。然后还要考虑类的已定义字段,以及使用get/set方法设置和获取已定义字段的值

    下面的代码显示了两个类。第一个类在布局中,如果其他开发人员需要更新代码,我个人将使用该布局以提高可读性,而不是浪费时间查找代码。第二节课按照您希望的方式重新安排

                public class MyClass
                {
                    private string _HelloWorld;
                    public string HelloWorld
                    {
                        get {return _HelloWorld;}
                        set {_HelloWorld = value;}
                    }
    
                    public void MyMethod
                    {
                        TestC();
                    }
    
                    public void TestA()
                    {
                        TestB();
                    }
    
                    public void TestB()
                    {
                        Console.WriteLine(HelloWorld);
                    }
    
                    public void TestC()
                    {
                        TestA();
                    }
    
                }
    


    以下是没有人引用过的其他产品,它们可以通过友好请求添加功能:

    自己写这篇文章并不难。VS2015安装程序中提供了新的Visual StudioVSIX项目模板,如果在(文件>新建>项目..Visual C#>扩展性)下找不到这些模板,只需修改安装(cmd>appwiz.cpl>VS2015更改/修改)

    好消息是CodeMaid项目是开源的,包含了大部分代码和逻辑,您需要重新排列代码块

    您需要的另一件事是调用堆栈,我们的一位助手Stackoverflow在这里提供了代码:

    鉴于这是一个悬赏,您可能期待一个完整的解决方案,对不起,我现在没有时间为您编写代码,但如果您遇到任何问题,我很乐意帮助您。请在评论中告诉我

    为了快速启动并运行,我个人只需复制此Visual Studio扩展中的代码,并用调用堆栈重新排序替换guts:。

    ReSharper插件“Greenkeeper”完成以下工作:

    该插件可以对“NewspaperCode”中的方法进行排序:首先是重要代码,然后是底部的详细信息。新闻纸模式与“下台规则”具有相同的行为


    Resharper声称能够以各种方式对方法进行排序。@RawN,我试图通过Resharper找到一种方法来实现这一点,但我找不到任何方法。我怀疑您是否能找到现成的方法。您当然可以使用roslyn()编写代码,它可以解析代码、确定调用层次结构等。@SimonMourier,我希望有人已经这样做了。@YacoubMassad请问您为什么要这样做?我真的不明白你的答案。你说你不知道有一个扩展可以做到这一点,但是你提供了一些选择。这些选项是做什么用的?很抱歉给你带来了困惑。我提到的选项是由ReSharper提供的,它是一个VisualStudio扩展。我为每个不同的选项提供了链接,允许您轻松更改文件中方法的顺序。其中一个选项使用“文件结构”窗口,按成员变量、属性和方法显示文件的结构。从那里,您可以使用鼠标按任意顺序拖放它们,您将在文件中看到新顺序的方法。我希望将这些方法作为重构选项自动排序(当然是按需排序),而不是手动排序。虽然这样做可行,但问题需要现有的解决方案(如果有的话)。我希望VisualStudio的一个生产力工具已经有了这个功能。按照我想要的方式对方法进行排序会带来一些可读性方面的好处。主要来说,你首先要了解高层次
                public class MyClass2
                {
                    private string _HelloWorld;
    
                    public void MyMethod
                    {
                        TestC();
                    }
    
                    public void TestC()
                    {
                        TestA();
                    }
    
                    public void TestA()
                    {
                        TestB();
                    }
    
                    public void TestB()
                    {
                        Console.WriteLine(HelloWorld);
                    }
    
                    public string HelloWorld
                    {
                        get {return _HelloWorld;}
                        set {_HelloWorld = value;}
                    }
                }