33

: この「機能」は現在 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# バージョンは問題ありません。

4

8 に答える 8

19

あなたが言ったように、コード領域はおそらくメソッド本体ではサポートされないと思います. VB.NET ではありません。

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

あなたのコードの場合:

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

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

個人的には、それらを「痛み」を引き起こしたままにしておきます。それらを分割して部分をリファクタリングできるようになるまで、正面と中央の作業が必要であることを明確にします。

于 2010-06-30T17:23:50.363 に答える
16

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

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

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

このように指定された理由については、私が覚えている限り VB が持っていた古い IDE 機能と関係があると思います: Tools + Options、Text Editor、Basic、VB Specific、Show procedure lineセパレーター。これは単なる推測であり、おそらくあまり良いものではありません。


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

于 2010-06-30T18:14:24.607 に答える
16

別の簡単な代替方法:

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

Ctrl+ M, Ctrl+H

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

ここに画像の説明を入力

于 2014-12-18T02:52:16.530 に答える
12

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

于 2015-11-24T01:21:22.600 に答える
10

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

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

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

ここで、リージョンはステートメント内で始まりif、ステートメントの外で終わります。恐ろしいですが、コンパイラはそれで問題ありません。

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

于 2010-06-30T17:25:28.843 に答える
4

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

C# チームは、この機能について別の考えを持っており、他の多くの場所で許可しています。#regionC#ディレクティブがさまざまな宣言コンテキストで発生する可能性があることに、私はいつも驚かされてきました。

#region Foo
class Bar {
#endregion

}

VB では、同等のコードは使用できません。

于 2010-06-30T17:41:37.793 に答える
3

この質問に対する最新の回答を探している人は、これが 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
于 2015-08-08T20:18:02.823 に答える
1

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

正直なところ、C# がリージョンの使用を制限することを望みます。C# プロジェクトを継承するときに、すべてのコード ファイルからそれらを削除するマクロがあります。

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

于 2010-07-03T06:40:26.537 に答える