VB.NET中的方法主体中不允许代码区域?
-
01-10-2019 - |
题
笔记: :现在,此“功能”已添加到Visual Studio 2015中,但是这个问题将会持续一段时间,因为并非每个开发人员或每个开发人员都可以访问最新和最出色的IDE,后来就可以访问它。
原始问题:
通常,我不会“需要”,甚至不考虑诸如方法主体中的代码区域之类的荒谬功能该代码违反了简单的重构,例如方法提取。
这就是为什么我认为我会在方法主体中尝试区域。我只是想在短期内组织代码。但是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
....
这会有编译器错误,但是C#版本还可以。
解决方案
作为 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#中起作用。
其他提示
我认为代码区域可能不会在方法主体中得到支持,因为正如您所说,它们会是(某些)“荒谬的功能” - 但是,在C#中,此 做 工作,至少在VS 2008和VS 2010中 - 不在VB.NET中。
话虽如此,我会避免它。将区域放在方法中只会导致人们制作更大的方法(因为那是唯一值得的一次),这是应避免而不是鼓励的东西。
如果您的代码:
违反简单的重构,例如方法提取
相反,我将重点放在做“复杂”重构(或任何需要)试图分解这些方法的地方。您的“四到五百行”的长度方法根本无法在其当前状态下保持。
就我个人而言,我会让他们造成“痛苦” - 很明显,他们需要右前方和中心工作,直到您可以将它们分解并重新分配部分为止。
它在Visual Basic 9.0语言规范的第3.3章中是明确的:
区域指令组源代码线,但对编译没有其他影响。整个小组可以在集成开发环境(IDE)中折叠,隐藏,扩展和查看。 这些指令是特殊的,因为它们既不能在方法主体中开始也无法终止
或换句话说:您不能这样做,因为规范是这样说的。
至于为什么这样指定,我认为它与VB所拥有的古老的IDE功能有关:工具 +选项,文本编辑器,基本,VB特定,显示过程行分离器。这只是一个猜测,可能不是一个很好的猜测。
更新:现在由罗斯林(Roslyn)支持,首先包括VS2015。
另一个简单的替代方法:
您可以做的是基本选择要添加的代码 #Region #End Region
基本上单击:
Ctrl+m, Ctrl+H
这基本上包装了代码。然后,为了使它变得更整洁,很容易找到您可以评论代码。最终结果看起来像这样:
我不知道VB,但是在C#中,据我所知,这是从1.0开始允许的。
确实,您甚至可以将代码区域放在交叉范围的奇数地方。例如:
class Test
{
static void Main()
{
if (DateTime.Now.Hour > 12)
{
#region Foo
Console.WriteLine("Afternoon");
}
#endregion
}
}
在这里 开始 在 if
声明,但是 结束 外面。可怕,但是编译器很好。
当您说IDE没有“让”您将代码放入区域时,您是什么意思?您有编译器错误吗?
这只是VB团队在将区域功能添加到视觉基本语言7中时做出的选择。它被视为一种功能,可用于在声明级别上组织而不是在方法内部,因此仅在该水平上允许。
C#团队对此功能有不同的感觉,并在许多其他地方允许它。我总是发现C#令人惊讶 #region
指令可以在不同的声明上下文中发生。
#region Foo
class Bar {
#endregion
}
VB中不允许等效代码。
对于任何寻求此问题最新答案的人,现在可以在VB.NET中进行(从 版本14 在)。
方法内部的区域指令
您可以将#区域放置在文件中的任何地方,内部功能甚至跨越功能主体中的任何地方。
OP的示例现在是完美的法律语法:
Sub RunSnippet()
Dim a as A = New A (Int32.MaxValue )
#Region "Test"
Console.WriteLine ("")
#End Region
End Sub
Visual Studio 2003 如果它们适用于vb.net,但功能已删除 Visual Studio 2005 然后。重构大型过程时真的很烦人,但是您可以将代码窗口拆分。
老实说,我希望C#会限制区域使用,因为它们过于使用。我有一个宏,在继承C#项目时将它们从所有代码文件中剥离。
删除的另一个功能是在 导航栏. 。我检查一下他们是否重新添加了每个新版本的功能 视觉工作室 自2005年以来。