代码之家  ›  专栏  ›  技术社区  ›  Paul Sasik

在VB.NET的方法体中不允许使用代码区域?

  •  32
  • Paul Sasik  · 技术社区  · 14 年前

    注意

    通常情况下,我不会“需要”或者甚至不会考虑一个可笑的特性,比如方法体中的代码区域,但是:我正在重构VB.NET代码,其中方法通常运行500行或更多的代码,并且引用是如此紧密地耦合,以至于代码无法进行简单的重构,比如方法提取。

    这就是为什么我想尝试方法体中的区域。我只是想组织短期的代码。但是IDE不允许我(导致了一个编译器错误)我只是好奇为什么?似乎代码区域不应该影响编译器、智能感知等。我遗漏了什么吗(仍在使用VS 2005 btw。)

    有趣的是: 这似乎是特定于语言的。在C#(我最初没有检查)中可以,但在VB.NET中不行。

    public module MyModule
        Sub RunSnippet()
            dim a as A = new A (Int32.MaxValue )
    
            #region 
            Console.WriteLine ("")
            #end region
           ....
    

    这会得到一个编译器错误,但C版本是正常的。

    8 回复  |  直到 9 年前
        1
  •  12
  •   Cary Bondoc Ktmock13    8 年前

    截至 2015年11月: Visual Studio 2015 现在支持了,你想怎么做就怎么做。

    With frmMain
    #region "A sample region in odd place"
      .show()
      .text = "Sample"
    #end region
    End With
    

    注: 对于visualstudio来说,它在VB.NET中似乎不起作用,但在C中却起作用。

        2
  •  19
  •   Reed Copsey    14 年前

    无法进行简单的重构,例如方法提取

    相反,我会把重点放在“复杂”的重构(或其他任何需要的)上,试图分解这些方法。你的“四五百行”长的方法在当前状态下根本不可能是可维护的。

    就我个人而言,我会让它们引起“痛苦”——让它们明显地需要工作,就在前面和中间,直到你可以分解它们并重构出部分。

        3
  •  16
  •   Zer0    9 年前

    另一种简单的替代方法:

    #Region #End Region 基本上点击:

    Ctrl键 + , + H

    这基本上包装了代码。然后为了使它更整洁,更容易找到你可以注释代码。最终结果如下:

    enter image description here

        4
  •  16
  •   Hans Passant    9 年前

    Region指令对源代码行进行分组,但对编译没有其他影响。整个组可以在集成开发环境(IDE)中折叠和隐藏,或者展开和查看。

    或者换言之:你不能这样做,因为规范这么说。

    至于为什么要这样指定,我想这与VB在我记事的时候就有的古老的IDE特性有关:工具+选项、文本编辑器、Basic、VB特定的、显示过程行分隔符。那只是猜测,可能不是很好。


        5
  •  10
  •   Jon Skeet    14 年前

    我不知道VB,但据我所知,在C中,从1.0开始就允许这样做。

    class Test
    {
        static void Main()
        {
            if (DateTime.Now.Hour > 12)
            {
    #region Foo
                Console.WriteLine("Afternoon");            
            }
    #endregion
        }
    }
    

    这里是这个地区 开始 if 在外面。很可怕,但是编译器可以。

    你说IDE不允许你把代码放在区域里是什么意思?你有编译器错误吗?

        6
  •  4
  •   JaredPar    14 年前

    这只是VB团队在visualbasic语言版本7中添加regions特性时所做的一个选择。它被视为一种特性,对于在声明级别而不是在方法内部进行组织非常有用,因此只允许在该级别进行组织。

    #region 指令可以出现在不同的声明上下文中。

    #region Foo
    class Bar {
    #endregion
    
    }
    

    VB中不允许使用等效代码。

        7
  •  3
  •   Community CDub    4 年前

    对于任何正在寻找这个问题的最新答案的人来说,现在在VB.NET中(从 version 14 打开)。

    方法体中的区域指令

    您可以将#Region#End Region分隔符放在文件中的任何位置、函数内部,甚至跨函数体。

    OP中的例子现在是完全合法的语法:

    Sub RunSnippet()
        Dim a as A = New A (Int32.MaxValue )
    
        #Region "Test"
        Console.WriteLine ("")
        #End Region
    End Sub
    
        8
  •  1
  •   AMissico    14 年前

    Visual Studio 2003 在VB.NET中使用了它们,但在中删除了该功能 Visual Studio 2005

    老实说,我希望C#会限制区域使用,因为它们被过度使用。我有一个宏,在继承C#项目时会将它们从所有代码文件中剥离出来。

    另一个被删除的特性是 导航栏 . 我检查他们是否为每个新版本的 Visual Studio 从2005年开始。