簡體   English   中英

VB.NET中的方法體內不允許使用代碼區域?

[英]Code regions not allowed within method bodies in VB.NET?

注意 :此“功能”現已添加到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
       ....

得到編譯器錯誤,但C#版本沒問題。

我認為代碼區域可能不會在方法體中得到支持,因為正如你所說的那樣,它們會(某種程度上)是“荒謬的” - 然而,在C#中,這確實有效,至少在VS 2008和VS 2010中 -只是不在VB.NET中。

話雖這么說,我會避免它。 將區域放在方法體中只會導致人們制作更大的方法(因為這是唯一值得的方法),這是應該避免的,而不是鼓勵的。

如果您的代碼:

無視簡單的重構,例如方法提取

相反,我會集中精力進行“復雜”的重構(或者無論如何)來嘗試分解這些方法。 你的“四五百行”長方法在當前狀態下根本無法維持。

就個人而言,我會讓他們造成“痛苦” - 明顯表明他們需要工作,正面和正中,直到你可以將它們分解並重構部分。

它在Visual Basic 9.0語言規范的第3.3章中是明確的:

Region指令對源代碼行進行分組,但對編譯沒有其他影響。 整個組可以在集成開發環境(IDE)中折疊和隱藏,或者展開和查看。 這些指令的特殊之處在於它們既不能在方法體內啟動也不能終止

換句話說:你不能這樣做,因為規范是這樣說的。

至於它為什么這樣被指定,我認為它與VB已經有的古老的IDE功能有關,只要我記得:工具+選項,文本編輯器,基本,VB特定,顯示程序行分隔符。 這只是一個猜測,可能不是一個非常好的。


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

另一種簡單的替代方法

您可以做的基本上是選擇要添加#Region #End Region的代碼,基本上單擊:

Ctrl + MCtrl + H.

這基本上包裝了代碼。 然后使它更整潔,更容易找到你可以評論代碼。 最終結果看起來像這樣:

在此輸入圖像描述

截至201511月:Visual Studio 2015中 ,現在支持它,只需執行您喜歡的操作。

示例代碼:

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

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

我不知道VB,但在C#中,據我所知,這已經被允許了1.0。

實際上,您甚至可以將代碼區域放在跨越范圍的奇數位置。 例如:

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

這里的區域在if語句中開始 ,但在它之外結束 可怕,但編譯器很好用。

當你說IDE沒有“讓”你把代碼放在地區時,你是什么意思? 你有編譯器錯誤嗎?

這只是VB團隊在將區域功能添加到Visual Basic語言版本7時所做的選擇。 它被視為一個特征,對於在聲明級別而不是在方法內部進行組織是有用的,因此僅在該級別允許。

C#團隊對此功能有不同的看法,並允許它在許多其他地方使用。 我總是覺得C ## #region指令可以在不同的聲明上下文中出現令人驚訝。

#region Foo
class Bar {
#endregion

}

VB中不允許使用等效代碼。

對於任何尋找這個問題的最新答案的人來說,現在可以在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

Visual Studio 2003將它們用於VB.NET,但在Visual Studio 2005及更高版本中刪除了該功能。 重構大型程序時真的很煩人,但你可以拆分代碼窗口。

老實說,我希望C#會限制區域使用,因為它們被過度使用了。 我有一個宏,在繼承C#項目時將它們從所有代碼文件中剝離出來。

刪除的另一個功能是導航欄中的可覆蓋方法列表。 我檢查他們是否從2005年開始為每個新版本的Visual Studio重新添加此功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM