C# の region の使いどころ

VisualStudio上でコードを折りたたむ機能で#region ~ #endgreionディレクティブというものがあります。「リージョン」と読みます。「レギオン」だと軍団で「L」と「R」が違うのでご注意を。

そんなリージョンですが、以下のように

public void Hoge()
{
    #region ナントカの処理
    
    if(this.....(中略)...
    
    }
    #endregion
}

と記述するとエディタ上でregionディレクティブで囲んだ個所が折りたためるようになります。

f:id:Takachan:20151123184054p:plain

任意の範囲を折りたたむことができるので、たとえ長大なコードでもコンパクトに表示することが可能です。

ただ、折りたたむ行数が増加するとVisualStudioのエディタのスクロールが重くなる場合があります。(大体2-300行くらいからスクロールがカクつきます。

この機能ですが、任意の範囲を折りたためる故、設計が悪く長いメソッドに対し悪用する事もできます。

public void Hoge()
{
    #region 処理ステップ1
    
    // 数十行 ~ 数百行の処理
    
    #endregion
    
    #region 処理ステップ2
    
    // 数十行 ~ 数百行の処理
    
    #endregion
    
    #region 処理ステップ3
    
    // 数十行 ~ 数百行の処理
    
    #endregion
}

折りたためば一見シンプルに見えますが、展開すると1000行単位でコードがあったりします。

こういったことが、クラスやほかの箇所にも適用できるため、複数のメソッドを#regionで囲んで「xxxを処理するところ」とか書いて折りたたんでおけば長大な実装をが一見きれいに整理されているように見えます。しかし、一見きれいに見えるだけで、スパゲティが隠れてるなどコードの良し悪しを判定する材料としても使えます。

故に、上記のような#region囲みが発生したらすぐにメソッド分割やクラス分けを行ったほうが良いです。

ただし、既にリリース済みの変更不可な既存コードの整理には割と威力を発揮するためそのような場面でしようするのもよいと思います。