33

注意:此“功能”现已添加到 Visual Studio 2015,但问题将持续一段时间,因为并非每个开发人员或每个开发商店都能在最新最好的 IDE 发布后立即访问它。

原始问题:

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

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

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

public module MyModule
    Sub RunSnippet()
        dim a as A = new A (Int32.MaxValue )

        #region 
        Console.WriteLine ("")
        #end region
       ....

得到一个编译器错误,但 C# 版本是好的。

4

8 回答 8

19

我认为方法体可能不支持代码区域,因为正如您所说,它们将是(有点)“荒谬的功能” - 但是,在 C# 中,这确实有效,至少在 VS 2008 和 VS 2010 中 -只是不在 VB.NET 中。

话虽如此,我会避免它。将区域放在方法主体中只会导致人们制作更大的方法(因为这是唯一值得的时候),这是应该避免的,而不是鼓励的。

如果您的代码:

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

相反,我会专注于进行“复杂”的重构(或任何需要的)来尝试分解这些方法。您的“四五百行”长方法在当前状态下根本无法维护。

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

于 2010-06-30T17:23:50.363 回答
16

它在 Visual Basic 9.0 语言规范的第 3.3 章中有明确说明:

区域指令对源代码行进行分组,但对编译没有其他影响。整个组可以在集成开发环境 (IDE) 中折叠和隐藏,或展开和查看。这些指令的特殊之处在于它们既不能在方法体中启动也不能终止

或者换句话说:你不能这样做,因为规范是这样说的。

至于为什么要这样指定,我认为这与我记忆中 VB 的古老 IDE 功能有关:工具 + 选项、文本编辑器、基本、VB 特定、显示程序行分隔符。这只是一个猜测,可能不是一个很好的猜测。


更新:现在由 Roslyn 支持,首先包含在 VS2015 中。

于 2010-06-30T18:14:24.607 回答
16

另一种简单的替代方法:

您可以做的基本上是选择要添加的代码,#Region #End Region然后单击:

Ctrl+ M, Ctrl+H

这基本上包装了代码。然后为了让它更整洁、更容易找到,你可以评论代码。最终结果将如下所示:

在此处输入图像描述

于 2014-12-18T02:52:16.530 回答
12

截至2015 年11 月:Visual Studio 2015中,现在支持它,只要做你喜欢的。

示例代码:

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

注意:早期版本的 Visual Studio 中,它似乎无法在 VB.NET 中运行,但在 C# 中却可以运行。

于 2015-11-24T01:21:22.600 回答
10

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

实际上,您甚至可以将代码区域放置在跨范围的奇怪位置。例如:

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

在这里,区域在语句内开始if,但在语句外结束。可怕,但编译器很好。

当您说 IDE 没有“让”您将代码放在区域中时,您是什么意思?你有编译器错误吗?

于 2010-06-30T17:25:28.843 回答
4

这只是 VB 团队在将区域功能添加到 Visual Basic 语言版本 7 时所做的一个选择。它被视为一种对在声明级别而不是在方法内部进行组织很有用的功能,因此仅在该级别允许使用。

C# 团队对这个特性有不同的看法,并允许它在许多其他地方使用。我一直对 C##region指令可以出现在不同的声明上下文中感到惊讶。

#region Foo
class Bar {
#endregion

}

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

于 2010-06-30T17:41:37.793 回答
3

对于正在寻找此问题的最新答案的任何人,现在可以在 VB.NET(从版本 14开始)中实现这一点。

方法体内的区域指令

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

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

Sub RunSnippet()
    Dim a as A = New A (Int32.MaxValue )

    #Region "Test"
    Console.WriteLine ("")
    #End Region
End Sub
于 2015-08-08T20:18:02.823 回答
1

Visual Studio 2003为 VB.NET 提供了这些功能,但在Visual Studio 2005及更高版本中删除了该功能。重构大型程序时真的很烦人,但您可以拆分代码窗口。

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

另一个被删除的特性是Navigation Bar中的可覆盖方法列表。我检查他们是否为自 2005 年以来的每个新版本的Visual Studio重新添加了此功能。

于 2010-07-03T06:40:26.537 回答