C#2.0のファイル構成(partial)

ホームC#プログラミング入門講座 > C#2.0のファイル構成(partial)

C#2.0のファイル構成(partial)

ファイルが3つ!?

VisualC#.NET Expressをダウンロードして使ってみて、「あれっ?」と気になった方は多いはず。そう、ファイルが3つもあるんですよね。しかも2つは同じクラスなのに。

これはちょっと常識破りです。なぜなら、「1クラス 1ファイル」というのがこれまでの常識でしたから、「1クラス 2ファイル」というのは非常に驚くべきことです。

そして残りの1個はなんとMain()だけのクラスです。ちょっと、新しいファイル構成について知っておく必要がありますよ。

Program.cs

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsApplication1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Program.csというのは、こんな感じです。あーだのこーだの書いてあって、一番重要なのは Run() メソッドです。この後に書いてある Form1 クラスが、真っ先に呼び出されるプログラムを意味します。これはWindowsフォームの常識でしたね。

1.0と1.1の頃は、自分で自分を new で実体化してました。今度は違う。Programという、「一番最初だけ登場するMain()用クラス」が別に存在します。この点、注意してください。

Form1.Designer.cs

namespace WindowsApplication1
{
    partial class Form1
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows フォーム デザイナで生成されたコード

        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(109, 67);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "押す?";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.Button button1;
    }
}

これも、中身は見慣れてますね。デザイン専用のコードです。ここはすべて、VisualC#.NETが自動で作ってくれます。私は何も書いてません。プロパティなんかは、右下のプロパティウィンドウで変更できます。

ここでは、イベントに注目してください。button1.Clickイベントに、button1_Clickというイベントメソッドが追加されていますね。ですが、このソースの中にはそんなイベントは存在しません。

おかしいなぁ、と思ったら、クラスの宣言のとこまで戻ってください。

partial class Form1

partialがC#2.0で新しく追加されたキーワードです。「部分的な」という意味です。ということは、「このクラスの片割れは別にあるよ」と言ってるんですね。

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("押すなよ!!","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);
        }
    }
}

実は、さっきの「Form1.Designer.cs」ではなく、こっちの「Form1.cs」がメインです。理由は3つあります。

まあ、クラスの必需品、主要メンバーがそろっているということです。さっき見つけられなかったイベントメソッドも、こっちに書いてます。こっちはデザインではなく、コードの動作をメインに書きます。

どちらにも partial が付いていることを確認してください。それ以外は、別にどうってことはありません。

まとめ

で、partial の何がいいかというと、「コードの分離」ができるところです。

これまでWebアプリでは普通にできましたが、Windowsアプリではできませんでした。簡単に言えば、InitializeComponent() という初期化メソッドを完全に分離して、ソースコードを見やすくするだけのことです。

partial にとくに深い使い方はありませんから、まあ知っておくだけで十分です。


[ ステップアップC# ]