連載:[完全版]究極のC#プログラミング

Chapter8 部分クラスと静的クラス

川俣 晶
2009/11/16

8.2 自動生成コードと安全に共存する

 部分クラスの実例をすぐ見たければ、Visual Studio 2008でWindowsアプリケーションやASP.NETアプリケーションのプロジェクトを作成するとよいだろう。

 Windowsアプリケーションであれば、次のようなコードが最初から生成されている。

public partial class Form1 : Form
{
   …

 ASP.NETアプリケーションであれば、次のようなコードが最初から生成されている。

public partial class _Default : System.Web.UI.Page
{
   …

 これらはpartialというキーワードがあることからわかるとおり、部分クラスである。これらのクラスは、プログラマーが自分で書く部分とツールが自動生成するコードを明確に分割するために使われている。

 このうち、部分クラスの状況を見やすいのはWindowsアプリケーションだろう。普通にコードを開くとプログラマーが自分で記述するコードが開くが、ソリューションエクスプローラで「フォーム名.Designer.cs」のファイルを開くと、自動生成される側のコードを見ることができる(図8.1参照)。


図8.1 ソリューションエクスプローラで表示される自動生成されたコード

 たとえば、フォームをダブルクリックしてLoadイベントのハンドラを生成させた場合、Form1.Designer.cs側のInitializeComponentメソッドには次の行が追加される。

this.Load += new System.EventHandler(this.Form1_Load);
Form1.Designer.csのInitializeComponentメソッドに追加されるコード

 そして、Form1.cs側には次のメソッドが追加される。

private void Form1_Load(object sender, EventArgs e)
{

}
Form1.csに追加されるコード

 このとおり、追加されたメソッドForm1_Loadはprivateではあるが、同じクラス内なので「new System.EventHandler(this.Form1_Load)」という形で参照することができる。

 さて、ここでソースファイルが2つに分割されている効能について考えてみよう。先ほど、部分クラスは、自動生成されるコードとプログラマーが書くコードが混在したクラスをスマートに実現するために使用されると書いた。しかし、Form1_Loadメソッドも自動生成されている以上、このケースでは“どちらのソースファイルも自動生成の対象になっている”のである。

 だが、その後のコードの管理という観点から見ると、両者には決定的な差があることがわかる。

this.Load += new System.EventHandler(this.Form1_Load);

 という1行は、フォームデザイナーのプロパティ管理機能(その内容はVisual Studio 2008のプロパティウィンドウに表示されている)が持つイベントの管理機能を使って、完全に“ソースコードをいっさい見ることなく”マウスの操作だけで管理ができるようになっている。つまり、全自動で扱うことができるコードなのである。

 一方、Form1_Loadメソッドのほうは、何の自動管理も用意されていない。プログラマーが自分で記述し、健全性を維持し続けなければならない。たとえば、フォームの名前をForm1から別の名前に変更しても、Form1_Loadというメソッド名が自動的に変わるわけではない。ソースコードを扱う主導権は100%プログラマーに与えられている。

 つまり、次の2つのソースファイルには、異なる役割が与えられているのである。

  • Form1.cs:サービスで空のメソッドを自動挿入することもあるが、基本的にプログラマーが自分の判断ですべて自由に書き換えてよい部分
  • Form1.Designer.cs:プログラマーにいっさいコードを見せることなく、フォームデザイナーがすべて適切に書き換えを行う部分。プログラマーが直接書き換えると、正しく管理できなくなる可能性があって危険

 ここでポイントになるのは、“プログラマーが直接書き換えると、正しく管理できなくなる可能性があって危険”という部分である。そのようなコードは別ファイルに分けてしまい、容易に書き換えられないようにすると安全性が高まる。また、プログラマーが書き換えてよい部分だけを見ながら作業できれば、作業効率もアップする。

 部分クラスとは、そのような効能を得るために使用されている。

 さて、ここで同様の効能を得るために、部分クラスのような新しい機能を導入せず、継承などの既存の機能を使ってもよいのではないか……と思った読者もいると思う。しかし、本来、1つのクラスで済むものを、コード編集の都合だけで2つに分けて継承関係を持たせることは別の意味での過剰な複雑さを持ち込むことになってしまう。とかく継承は問題を起こしやすいので、継承が本当に必要でない場面では、使わないほうが安全だろう。そういう意味で、部分クラスは継承のように過剰に強力すぎることはなく、リーズナブルな機能といえる。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter8 部分クラスと静的クラス
    1.8.1 部分クラス(Partial Class)
  2.8.2 自動生成コードと安全に共存する
    3.8.3 リフレクションと部分クラス
    4.8.4 部分クラスを使ううえでの注意点
    5.8.5 静的クラス(Static Class)/【Exercise】練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間