質問

ノート: :この「機能」はVisual Studio 2015に追加されましたが、すべての開発者やすべての開発ショップが発表されるとすぐに最新かつ最高のIDEにアクセスできるわけではないため、問題はしばらく続きます。

元の質問:

通常、メソッドボディ内のコード領域などのばかげた機能を「必要」したり、馬鹿げた機能を検討したりしませんが、メソッドが500行以上のコードを日常的に実行し、参照が非常に緊密に結合されている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#バージョンは問題ありません。

役に立ちましたか?

解決

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

他のヒント

コード領域はおそらくメソッドボディではサポートされていないと思います。なぜなら、あなたが言ったように、(やや)「ばかげた機能」になるからです。 します 少なくともVS 2008およびVS 2010では、VB.NETではありません。

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

あなたのコードの場合:

メソッド抽出などの単純なリファクタリングを無視します

代わりに、「複雑な」リファクタリング(または必要なもの)を行うために、これらの方法を分割しようとすることに焦点を当てます。あなたの「400ライン」の長い方法は、現在の状態ではまったく維持可能である方法はありません。

個人的には、「痛み」を引き起こしたままにしておきます。彼らが分裂して部分を取り除くことができるまで、彼らが仕事、正面、中央に仕事が必要であることを明らかにします。

これは、Visual Basic 9.0言語仕様の第3.3章で明示的です。

Region Directives Source Codeのグループラインですが、コンピレーションに他の影響はありません。統合開発環境(IDE)で、グループ全体を崩壊させて隠したり、拡張したり見たりすることができます。 これらの指令は、メソッド本体内で開始も終了もできないという点で特別です

または言い換えれば、仕様がそう言っているので、それをすることはできません。

このように指定された理由については、VBが覚えている限り、VBが持っていた古くからのIDE機能と関係があると思います:ツール +オプション、テキストエディター、基本、VB固有、ショー手順ラインセパレーター。それは単なる推測であり、おそらくあまり良いものではありません。


更新:現在、VS2015で最初に含まれるRoslynによってサポートされています。

別の簡単な代替方法:

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

Ctrl+m, Ctrl+h

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

enter image description here

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

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

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

ここで地域 開始 以内 if 声明、しかし 終わり それの外。恐ろしいですが、コンパイラはそれで大丈夫です。

IDEが地域にコードを「させない」と言ったとき、あなたはどういう意味ですか?コンパイラエラーが発生しましたか?

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

C#チームは、この機能について異なって感じ、他の多くの場所でそれを許可しました。 C#が驚くべきことだといつも思っていました #region 指令は、さまざまな宣言コンテキストで発生する可能性があります。

#region Foo
class Bar {
#endregion

}

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

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

メソッドボディ内の領域指令

#region…#end region Delimitersをファイル、内部の関数、さらには関数本体全体にまたがる場所に配置することができます。

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#が地域の使用を制限することを望みます。 C#プロジェクトを継承するときに、すべてのコードファイルからそれらをストリップするマクロがあります。

削除されたもう1つの機能は、上の過剰な方法のリストでした ナビゲーションバー. 。私は、彼らが新しいバージョンのすべてにこの機能を再添加したかどうかを確認してください ビジュアルスタジオ 2005年以来。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top