web-dev-qa-db-ja.com

VB.NETのメソッド本体内でコード領域は許可されていませんか?

:この「機能」はVisual Studio 2015に追加されましたが、すべての開発者またはすべての開発ショップが最新かつ最高のIDE出たらすぐ。

元の質問:

通常、私はメソッド本体内のコード領域などのばかげた機能を必要としないか、または考えさえしませんが、私はVB.NETコードをリファクタリングしています。このコードは、メソッド抽出などの単純なリファクタリングを拒否します。

そしてそれが、メソッド本体内の領域を試すことを考えた理由です。短期間のコードを整理したかっただけです。しかし、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#バージョンは問題ありません。

32
Paul Sasik

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#では機能しています。

11
Cary Bondoc

コード領域は、メソッド本体ではおそらくサポートされないだろうと思います。なぜなら、それらは、(ある程度)「ばかげた機能」になるからです。ただし、C#では、これはdoesで機能しますVS 2008およびVS 2010-VB.NETではありません。

そうは言っても、私はそれを避けます。メソッド本体内に領域を置くことは、人々がより大きなメソッドを作成することにつながるだけです(それはそれが価値がある唯一の時間だからです)、これは避けられるべきものであり、推奨されません。

あなたのコードの場合:

メソッド抽出などの単純なリファクタリングに反する

代わりに、これらのメソッドを分割しようとする「複雑な」リファクタリング(またはそれが必要とするもの)の実行に焦点を当てます。 「400行または500行」の長いメソッドを現在の状態で維持することはできません。

個人的には、私はそれらを「痛み」の原因にしておきます-あなたがそれらを分解して部分をリファクタリングできるまで、彼らが右前と真ん中に作業が必要であることを明らかにします。

19
Reed Copsey

これは、Visual Basic 9.0言語仕様の3.3章で明示されています。

Regionディレクティブはソースコードの行をグループ化しますが、コンパイルには他の影響を与えません。統合開発環境(IDE)では、グループ全体を折りたたんで非表示にしたり、展開して表示したりできます。 これらのディレクティブは、メソッド本体内で開始も終了もできないという点で特別です

または、言い換えると、仕様にそのように記述されているため、実行できません。

なぜこれがこのように指定されたかについて、私はそれが古くからのIDE機能と関連があると考えていますVB覚えることができます:ツール+オプション、テキストエディター、基本、VB固有、手順行の区切りを表示。これは単なる推測であり、おそらくあまり良いものではありません。


更新:Roslynでサポートされるようになりました。最初にVS2015に含まれています。

16
Hans Passant

別の簡単な代替方法:

あなたができることは基本的にあなたが追加したいコードを選択することです#Region #End Regionそして基本的にクリック:

Ctrl+M、 Ctrl+H

これは基本的にコードをラップします。そして、それをさらにすっきりと見つけやすくするために、コードにコメントを付けることができます。最終結果は次のようになります。

enter image description here

15
Zer0

VBについては知りませんが、C#では、私の知る限り、1.0から許可されています。

実際、スコープをまたぐ奇妙な場所にコード領域を配置することもできます。例えば:

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

ここでは、領域startsifステートメント内にありますが、endsはその外側にあります。恐ろしいですが、コンパイラはそれで大丈夫です。

IDEでコードを領域に配置できなかったとはどういう意味ですか?コンパイラエラーが発生しましたか?

10
Jon Skeet

これは、VBチームがVisual Basic言語のバージョン7にリージョン機能を追加するときに行った選択でした。これは、内部ではなく、宣言レベルでの整理に役立つ機能と見なされました。メソッド、したがってそのレベルでのみ許可されました。

C#チームはこの機能について別の見方をしており、他の多くの場所でそれを許可しています。 C##regionディレクティブは、異なる宣言コンテキストで使用できます。

#region Foo
class Bar {
#endregion

}

同等のコードはVBでは許可されていません。

4
JaredPar

この質問に対する最新の答えを探している人にとって、これはVB.NETで可能になりました( バージョン14 から始まる)。

メソッド本体内の領域ディレクティブ

#Region…#Endリージョン区切り文字は、ファイル内の任意の場所、関数内、さらには関数本体全体に配置できます。

OPの例は、完全に正当な構文になりました。

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

    #Region "Test"
    Console.WriteLine ("")
    #End Region
End Sub
3
Saragis

Visual Studio 20にはVB.NET用の機能がありましたが、-Visual Studio 2005以降では機能が削除されました。大きなプロシージャをリファクタリングするときは本当に面倒ですが、コードウィンドウを分割できます。

正直なところ、C#が過度に使用されているため、リージョンの使用を制限したいと思います。 C#プロジェクトを継承するときにすべてのコードファイルからそれらを取り除くマクロがあります。

削除された別の機能は、ナビゲーションバーのオーバーライド可能なメソッドのリストでした。 2005年以降、Visual Studioのすべての新しいバージョンでこの機能が再度追加されたかどうかを確認します。

1
AMissico