Application.Runメソッドは、その英語のメソッド名を見れば分かるように、「アプリケーション(Application)を実行する(Run)」ための処理を行っている。実際には、Application.Runメソッドでは、Windowsアプリケーションの「メッセージ・ループ(メッセージ・ ポンプ)」処理が行われる。
メッセージ・ループとは、簡単にいえば、終了が呼び出されない限りずっと処理を実行し続けるための仕組みである。つまり、「Application.Run(new Form1());」というコードが実行するメッセージ・ループ処理では、Form1が終了しない限りずっとForm1の処理を実行し続けるということになる。もしForm1が終了すれば、それによりApplication.Runメソッド(=メッセージ・ループ処理)が終了する。Mainメソッド内には、ほかに実行するメソッドはないので、ここでアプリケーション自体が終了となる。
Windowsアプリケーションの実行を正しく理解するには、Windowsのメッセージ・ループの仕組みについてもよく知っておく必要があるので、ここでもう少し詳しく解説しておこう。
Windowsのアプリケーションの実行は、Windowsメッセージ(=処理実行の単位)を順次処理することでアプリケーションの実行を実現する。例えば次の3つのメッセージを順番に処理することで「アプリケーション画面の表示」という処理が実現できる(説明の便宜上、メッセージ内容は簡略化している)。
これら3つのメッセージは、メッセージ・キューと呼ばれるメッセージ処理の順番待ちリストに追加される(キューの概念はこのリンク先を参考にしてほしい)。メッセージ・ループは、このキューにたまるメッセージ・リストを参照して、古いものから順番に取り出して処理するための仕組みである。
例えば、映画『ブルース・オールマイティ』では、一時的に神様になったジム・キャリーが人々の「神様へのお願いリスト」の中から1つずつお願いを処理していくが、メッセージ・ループ処理もこれと同じように、順番待ちのメッセージ・リストから1つずつメッセージを処理していくことになる。身近な例でいえば、Outlook Expressなどのメーラで、古いメールから1件ずつ読んでいくところを想像してみるとよいだろう。
このようにWindowsのメッセージ・ループでは、メッセージ・キューにたまる順番待ちのメッセージ・リストを、 ループしながらひたすらチェックして、メッセージが来たら1件ずつそのメッセージ処理を行う。このメッセージ・ループ処理こそが、Windowsアプリケーションの実行エンジンとなっているのである。
以上で、アプリケーションの骨格となる仕組みを解説したことになる。最後に、残りのコードを簡単に解説していこう。次のコードを参照してほしい。
……前略……
namespace WindowsApplication1
{
……中略……
public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
……中略……
}
/// <summary>
/// 使用されているリソースに後処理を実行します。
/// </summary>
protected override void Dispose( bool disposing )
{
……中略……
}
#region Windows フォーム デザイナで生成されたコード
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
……中略……
}
#endregion
……中略……
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
}
}
Form1クラスには、エントリ・ポイントであるMainメソッドを除いて、次のような変数(「フィールド変数」とも呼ばれる)とメソッドがある。
(1) フィールド変数:private System.ComponentModel.Container components
(2) メソッド:public Form1()
(3) メソッド:protected override void Dispose( bool disposing )
(4) メソッド:private void InitializeComponent()
これらの変数やメソッドの前にあるpublic、protected、privateは前述のclassのところで説明したアクセシビリティである。このアクセシビリティは、クラスだけでなく、変数やメソッドも修飾することができる。
それでは、これらのフィールド変数やメソッドについて、個別に解説していこう。
(1)の「components」変数はクラス内で使用されるフィールド変数で、コンポーネント を管理するためのものだ(「コンテナ」と呼ばれる)。コンポーネントについては、改訂版 C#入門の「Column - コンポーネントとコントロール -」を参照してほしい。
private System.ComponentModel.Container components = null;
ただし実際には、上のコードのように「null」が代入されていて、実質的に使われていないといえる。よって、この変数の内容や使用方法について、現段階では完全に理解しておく必要はなく、プログラミングに慣れるに従ってマスターしていけばよいだろう(本稿では割愛させていただく)。
(2)の「public Form1()」は、前述したnew演算子付きのメソッドで呼び出されるコンストラクタである(VB.NETでは「Public Sub New()」というメソッド名になる)。このコンストラクタでは、具体的にはForm1クラスの初期化処理(前処理。例えば、変数に最初の値を代入する処理や、クラス作成時に実行しなければならない処理)を行う。実際のコードでは、次のコードにあるように(4)のInitializeComponentメソッドを呼び出しているだけである。
public Form1()
{
……中略……
InitializeComponent();
……中略……
}
次に、(3)の「protected override void Dispose( bool disposing )」を解説しよう。
Copyright© Digital Advantage Corp. All Rights Reserved.