PG日誌

各記事はブラウザの横幅を1410px以上にすると2カラムの見出しが表示されます。なるべく横に広げてみてください。

C# の region の使いどころ

VisualStudio上で任意の位置のコードを折りたたむ機能で #region ~ #endgreion ディレクティブというものがあります。「リージョン」と読みます。

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

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

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

f:id:Takachan:20151123184054p:plain

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

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

ネストすることも可能で以下のようにリージョンの中にリージョンを入れるとネストして折りたたむことができます。

public void Hoge()
{
    #region 外側の折りたたみ
    
    // 何かの処理

    #region 内側の折りたたみ

    if(this.....(中略)...
    
    #endregion // 内側の折りたたみ
    #endregion // 外側の折りたたみ
}

この機能ですが、任意の範囲を折りたためるため、例えば設計が悪く長いメソッドブロックをコンパクトに見せることができます。

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

折りたたむことで一見シンプルに見えますが、展開すると1000行単位でコードがあったりしても大丈夫です。

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

したがって上記のような #region 囲みが発生したらすぐにメソッド分割やクラス分けが必要なサインとみることもできます。

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

### 関連記事

takap-tech.com