region の使い方
C#のプリプロセッサディレクティブのひとつにregionというのがあることをご存知の方は多いと思います。しかし、これを 有意義に使いこなせているかというとなかなか難しいものだと思います。ここではregionの基本的な使い方とその実例を実際のコードを通して見てみます。(正確にはC#にはプリプロセッサは存在しません)
regionはソースを見やすくする
まずは簡単にregionについて説明しておきます。regionとはC#のプリプロセッサディレクティブの一つで ソースコードに一定の”領域”を設定します。使用方法は簡単で、ソースの途中で次のように #region xxxxxx と#endregion で囲まれた個所が”領域”になります。
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Diagnostics;
#endregion
さて、若しregionが上記の字面通りの意味しかなかったらあまり意味がありません。更に言うならば、これは Visual Studioなどをはじめとする開発ツールが積極的にサポートしてくれなくては意味がありません。 例えば、VC#ではこのregionとendregionで囲まれた部分を折りたたむことができます。いまいち想像し難い方 (見たことがない)はVSを起動して「Windows アプリケーション」で新規にプロジェクトを作成してみてください。 その中に「Windows フォーム デザイナで生成されたコード」という四角い枠で囲われた文字が見つかると思います。 次に横にある+のマークをクリックしてみてください。それまで折りたたまれていたコードが出現する様子がわかると思います。
このようにソースコードを折りたたんでおくと、現在注力している部分だけを見ることができたり、スクロールの回数を 大幅に減らすことができるようになります。又、他人のコードを見る際、regionを上手く使用してプロパティやメソッド イベントハンドラなどを分けておくと、鳥瞰図的に見ることができます。
実例で見るregion
では実際にどれほどみやくすなるのかを、示したいと思います。ここではさきほども登場した「Windows アプリケーション」 テンプレートで作成される雛型をregionで整形してみます。通常は以下のようなコードが生成されるはずです。
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace WindowsApplication
{
/// <summary>
/// Form1 の概要の説明です。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows フォーム デザイナ サポートに必要です。
//
InitializeComponent();
//
// TODO: InitializeComponent 呼び出しの後に、
// コンストラクタ コードを追加してください。
//
}
/// <summary>
/// 使用されているリソースに後処理を実行します。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows フォーム デザイナで生成されたコード
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "Form1";
}
#endregion
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
}
}
これをregionを使って整形するといかのような感じになります。
{
/// <summary>
/// Form1 の概要の説明です。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private変数
コンストラクタ
Disposeメンバ
Windows フォーム デザイナで生成されたコード
メインエントリポイント
}
}
それぞれの領域に何が含まれているのかは整形前のコードを見れば一目瞭然だと思いますが、どうでしょうか?(regionの使い方はこちらでも解説しています。) 初めてこの雛型を見た人が分かりやすいと思うのはどちらでしょうか?自分なら後者の方を選びます。 regionは使い方次第ではまだまだ色々なことができそうです。マクロや、はたまた本当にプリプロセッサを作って その機能を生かしたいものです。
VS2005ではpartialを利用して見やすくなる
最後に、上記のように見やすく領域に分けたのですが、次期Visual Studioである2005からはC#2.0を使用することが できるようになります。この2.0には様々な追加機能があるのですが、その中にパーシャルタイプというものがあります。 partialというキーワードを型に付加するこによってその型のソースコードを別のファイルに分割して記述できるようになります。 これはコンパイル時にコンパイラによって結合されるので、パフォーマンスの心配はありません。つまり、ソースを見やすくする ための機能だといえます。この機能を利用すると、上記のように全てregionで折りたたむ必要はなくなります。よって将来的には regionのまた別の使い道がでてくることを期待したいものです。