Program.cs

前回のソリューションエクスプローラの探検で見た Program.cs をのぞいて見た。

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

namespace Learn
{
    static class Program
    {
        ///
        /// アプリケーションのメイン エントリ ポイントです。
        ///

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

意外に短い。ぱっと見て見慣れないのが、[STAThread] というところだ。

C#によるプログラミング入門』というページがC#入門にはわかりやすいので調べてみたが、見つけられなかった。

そこで、Google で [STAThread] で検索してみると、『いろいろ備忘録日記』に説明があった。シングルスレッドアパートメントモデルという COM/OLE の機能を使うのをコンパイラに指示するためのアトリビュートらしい。

COM が何かというのは置いておいて、アトリビュートというのが気になった。アトリビュートについては、@ITの記事で『C#入門 第20回 実行時に参照可能な属性』 に実例付きで説明があった。属性は、クラスやメソッドに対して付加情報を付け加える機能を提供するものらしい。クラスやメソッドのすぐ前に属性を記述しておくと、C#の言語仕様を変えずにクラスやメソッドにC#の言語にない機能を付け加えられるらしい。例えば、次の例では、ビルどしたプログラムの実行時とデバッグ時の動作を変えることができる。

1: using System;
2: using System.Diagnostics;
3:
4: namespace ConsoleApplication15
5: {
6:   class Class1
7:   {
8:     [Conditional("DEBUG")]
9:     private void test()
10:     {
11:       Console.WriteLine("test called");
12:     }
13:     static void Main(string[] args)
14:     {
15:       Class1 instance = new Class1();
16:       Console.WriteLine("call start");
17:       instance.test();
18:       Console.WriteLine("call end");
19:     }
20:   }
21: }

話は Program.cs に戻るが、アトリビュートは付加的情報らしいので、なくてもいい場合もあるかもしれないと思い、[STAThread] の前に¥¥をつけてコメントアウトして、[デバッグ] - [デバッグ開始] を実行してみたが、ちゃんとウィンドウが表示された。ただし、ドラッグアンドドロップを利用するときなどは必須らしいのでそのままにしておいた方がいいらしい。

次に目につくのは、冒頭の using ディレクティブのついている文の部分だ。C#はCとちがって、ソースにヘッダーファイルを読み込んだりはしない。標準ライブラリはすべて .NET フレームワークの中に収められていて、すべてクラス化されている。ユーザはそのクラスからインスタンスを生成したり、クラスメソッドを呼び出して使ったりする。

クラスは名前空間で分類されているので、呼び出すときは、System.Console.Write() のようにドット記法で呼び出す。using ディレクティブで名前空間を指定するとメソッドを呼び出すときに名前空間の指定を省略できる。たとえば、System.Console.Write() は using System しておくと、Console.Write() で呼び出すことができる。

Program.cs の using 文で指定された名前空間のうち使われていないものがあればコメントアウトしても動くはずだ。実際、System.Collections.Generic と System.Link の二つの名前空間を指定した using 文はコメントアウトしても実行できた。System.Windows.Forms をコメントアウトするとコンパイルエラーになった。

名前空間はC#独自のものだが、ファイルのフォルダーのイメージで利用できる。ファイルのフォルダーにクラスが入っていてそれを利用するというイメージでライブラリを使うことができるので慣れると便利だ。

最後に、Main関数の中をのぞいてみた。最後の行の、

Application.Run(new Form1());

はフォームのオブジェクトを作って、それを表示し、それに関係するイベントを拾うイベントループが始まるのだなということが分かる。しかし、

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

についてはよく分からない。Help 画面を表示してコピペして検索し、説明を読んだが、表示関係の初期設定をするくらいしか分からなかった。思い切ってこの2行もコメントアウトしたら、コンパイルして動かすことができた。表示の調整をしているらしい。

オブジェクト指向プログラムは、プログラムの本体は変えずに、周辺の設定を簡単に変えることができるのでプログラムが作りやすい。C#の Main 関数をいじってみて、C#のプログラミングの癖のようなものがわかる。つまり、大まかに動くプログラムを作っておいて、後で、機能を追加していくというやり方が比較的やりやすいということだ。

ともあれ、この Program.cs でやっていることは、Form1 のインスタンスを生成して、イベントループを開始するということだけだ。イベントループの処理自体はコードには現れない。.NET がひきうけてやってくれるからだ。
[PR]
by tnomura9 | 2010-01-23 07:35 | C# | Comments(0)
<< Form1.cs ソリューションエクスプローラー >>