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

Pau*_*sik 32 .net c# vb.net code-regions

注意:此"功能"现已添加到Visual Studio 2015中,但问题将持续一段时间,因为并非每个开发人员或每个开发工作室都会在它出现时立即访问最新和最好的IDE.

原始问题:

通常情况下,我不会"需要"甚至考虑一个荒谬的功能,例如方法体内的代码区域,但是:我正在重构VB.NET代码,其中方法通常运行500行或更多代码并且引用紧密耦合到代码违反了简单的重构,例如方法提取.

这就是为什么我认为我会在方法体中尝试区域.我只想组织短期代码.但IDE不允许我(导致编译器错误.)我只是好奇为什么?似乎代码区域不应该影响编译器,intellisense等.我错过了什么?(仍然使用VS 2005 btw.)

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

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

        #region 
        Console.WriteLine ("")
        #end region
       ....
Run Code Online (Sandbox Code Playgroud)

得到编译器错误,但C#版本没问题.

Ree*_*sey 19

我认为代码区域可能不会在方法体中得到支持,因为正如你所说的那样,它们将是(某种程度上)"荒谬的特征" - 但是,在C#中,这确实有效,至少在VS 2008和VS 2010中 -只是不在VB.NET中.

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

如果您的代码:

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

相反,我会集中精力进行"复杂"的重构(或者无论如何)来尝试分解这些方法.你的"四五百行"长方法在当前状态下根本无法维持.

就个人而言,我会让他们造成"痛苦" - 明显表明他们需要工作,正面和正中,直到你可以分解并重构部分.

  • 里德·科普西 - 真的不同意.我认为代码自然地定义了它的结构.松散耦合的部件非常适合用于引入具有一些参数的方法,但是如果代码部分仅出现一次并且紧密耦合(即,如果提取的话将具有许多参数)被提取,则它实际上可以模糊代码以创建用于这些的方法. .我在c#中一直使用区域来折叠代码段并保持结构清晰,因为任何"if"块或"case"块比屏幕长. (4认同)
  • @Jon:然而,VB.NET不支持它们.就在C#中.我重写了......声音更好? (3认同)
  • 是的,在理想的世界中,我们不会有难以重构的大型方法.但在现实世界中,我们有1000多个方法体,没有预算可用于重构.因此,如果我可以在我的vb.net代码中插入#regions,那将是非常棒的.也许我必须写一个插件...... (3认同)

Han*_*ant 16

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

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

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

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


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


Zer*_*er0 15

另一种简单的替代方法

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

Ctrl+ M,Ctrl+H

这基本上包装了代码.然后使它更整洁,更容易找到你可以评论代码.最终结果看起来像这样:

在此输入图像描述


Car*_*doc 11

截至201511月:Visual Studio 2015中,现在支持它,只需执行您喜欢的操作.

示例代码:

With frmMain
#region "A sample region in odd place"
  .show()
  .text = "Sample"
#end region
End With
Run Code Online (Sandbox Code Playgroud)

注意:在Visual Studio的早期版本中,似乎它不能在VB.NET中工作,但在C#中它正在工作.

  • +1并重新选择为最佳答案.谢谢@Cary Bondoc:我添加了一条关于你对原始问题的答案的说明. (2认同)
  • 它在visual studio中工作,但在单独的构建服务器上使用msbuild构建失败,即使它使用相同的.net框架版本的msbuild.[MSDN](https://msdn.microsoft.com/en-us/library/w96cy299.aspx)表示VS 2015不允许这样做 (2认同)

Jon*_*eet 10

我不知道VB,但在C#中,据我所知,这已经被允许了1.0.

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

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

这里的区域在声明中开始if,但在它之外结束.可怕,但编译器很好用.

当你说IDE没有"让"你把代码放在地区时,你是什么意思?你有编译器错误吗?