フレッシュマン企画 連載
簡単!Visual Studio 2008入門

第4回 Visual Studio 2008のひな型コードを理解する

デジタルアドバンテージ 一色 政彦
2009/06/03
Page1 Page2 Page3 Page4

 本連載は、「簡単!Visual Studio 2005入門」「簡単!Visual Studio .NET入門」を現在の最新環境に合わせて改訂したものです。

 今回は、前回に引き続き、Visual Studio 2008(以降、VS 2008)でWindowsアプリケーション(以降、Winアプリ)のプロジェクトを新規作成したときに自動生成される初期コード(以降、ひな型コード)を見ながら、Mainメソッドの処理内容から、プログラム全体のコード内容までを一通り解説する。

Mainメソッドの内容の理解

 まずは、Mainメソッドの処理内容について見ていくことにしよう。前回も示したが、MainメソッドはProgram.csファイルの中にある。

……前略……
using System.Windows.Forms;
……中略……
namespace WindowsApplication1
{
  static class Program
  {
    ……中略……
    [STAThread]
    static void Main()
    {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
  }
}
エントリ・ポイントであるMainメソッドの処理内容
Mainメソッドのスコープを参照すると、「Application.Run(new Form1());」という1文がある。これがMainメソッドの肝となる処理内容である。なお、「static class Program」については前回説明済み

 Mainメソッドのスコープを見ると、まず次のような文がある。

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

 これらの文の詳細な説明は(.NET初学者には不要と思われるので)割愛するが、何のためのコードか分からないとすっきりしないと思うので、その意味だけを簡単に述べておく。

 「Application.EnableVisualStyles();」はボタン、ウィンドウやテキストボックスなどのコントロールの外観をWindows XPスタイルに変更するためのものである(詳しくは「.NET TIPS:WindowsアプリケーションをWindows XPスタイルの外観にするには?」を参照)。

 一方、「Application.SetCompatibleTextRenderingDefault(false);」はWindowsフォーム上のコントロールなどにテキストを描画する既定(=デフォルト)の方法を切り替えるためのもので、このコードのようにパラメータ(=入力)にfalseを指定して呼び出すと、よりパフォーマンスに優れたテキスト描画を行ってくれる*1

*1 .NETでは「GDI+」というWindowsの描画エンジンに対応したライブラリが導入されているが、これにはパフォーマンスなどに問題があったため、VS 2005以降ではこれに加えて、以前のWindows標準エンジンである「GDI」もサポートされるようになった。上記のコードによって、GDI+のパフォーマンス問題を回避してGDIによるテキスト描画が行われるが、その半面、メソッド名の「Compatible Text Rendering」(=互換性のあるテキスト描画)という語句が示すように、テキスト描画に関してVS 2005以前のVisual Studio .NET 2002/2003との互換性がなくなるので、注意が必要である。

 続いて次の1文がある。

Application.Run(new Form1());

 実はこの1文では、2つのメソッドが1つに組み合されて使用されている。これを2つに分解すると、次のようになる。

(1) Application.Run(<オブジェクト>)
(2) <オブジェクト> = new Form1()

 メソッドが実行される順番は、(1)のパラメータ部分に当たる(2)が先に実行され、次に(1)が実行される。よって、この順番で解説していこう。

 まず(2)は、Form1クラスのインスタンスを作るためのメソッドである(前回説明した「メソッドの使用パターン1」のケース)。ただしこのメソッドは、次の2点で普通のメソッドとは異なる特殊なメソッドである。

  • メソッド「Form1()」の前にnewが追加されている
  • クラス名(Form1)と同じメソッド名(Form1())が使われている

  「new <クラスの名称>()」という構文のように、先頭にnew演算子(VBではNew演算子)が付くメッドはクラスのインスタンスを作成するためのもので、このようなメソッドは「コンストラクタ」と呼ばれる。実はオブジェクト指向では、このコンストラクタ・メソッドこそがオブジェクトを生成するための仕組みである

 Windowsアプリケーションのひな型コードでは、アプリケーション実行のきっかけとしてMainメソッドが呼ばれ、最初にこのForm1コンストラクタでForm1オブジェクトが作成される。この後はこのForm1オブジェクトからさまざまなオブジェクトを生成して、アプリケーションが動作するというわけである(前回も図解で説明した)。

 次に(1)の「Application.Run(<オブジェクト>)」メソッドは、(2)で生成されたForm1オブジェクトをパラメータ(=入力)として受け取っている。戻り値はvoid(=なし)なので*2、Runメソッドの戻り値は無視している(=どこにも代入していない。前回説明した「メソッドの使用パターン2」のケース)。

*2 メソッドの戻り値について調べるには、通常、VS 2008のヘルプであるMSDNライブラリを参照するが、その参照方法については次回以降で詳しく説明する。上記のApplication.Runメソッドについては、オンライン版MSDNの「Application.Run メソッド (Form)」を参照するとよい。

 このApplication.Runメソッドも、Mainメソッドと同じく静的メソッドである。つまり、オブジェクトがなくてもメソッドを呼び出すことができる。それでは、「.」で接続された「Application」はオブジェクトではないのか? という疑問を持つ読者がいるかもしれない。

 しかし、この「Application」はオブジェクトではなく、クラスである。つまり、「Application.Run(<オブジェクト>)」というコードは、ApplicationクラスのRunメソッド(静的メソッド)を呼び出しているということである。このコードで使われている静的メソッドの呼び出し形式を構文としてまとめると、次のようになる。

<クラス名>.メソッド名(パラメータ);

 一方、クラスのオブジェクトを経由して、動的メソッド(=静的メソッド以外のメソッド)を呼び出す形式を構文としてまとめると、次のようになる。

変数の型 オブジェクト変数 = new <クラス名>();
オブジェクト変数.メソッド名(パラメータ);

 つまり、通常のメソッドでは必ずコンストラクタでオブジェクト生成してから、生成されたオブジェクトを経由してメソッドを呼び出す必要がある。それに対し、静的メソッドの呼び出しでは、オブジェクトを生成せずに、クラスの中のメソッドを直接呼び出すことになる。よって、静的メソッドであるRunメソッドは、Application.Run(<オブジェクト>)という呼び出し形式になっている。

 このApplicationクラスは、.NETのクラス・ライブラリに用意されているクラスで、System.Windows.Forms名前空間にある。しかし、上の「Application.Run(<オブジェクト>)」というコードでは、「System.Windows.Forms.Application」のように名前空間を付けずに呼び出している。このように名前空間なしでクラスが呼び出せる理由は、使用するクラスの名前空間が事前に宣言されているからだ。具体的には、ソース・コードの先頭にある次の記述があるためである。

using System.Windows.Forms;

 C#では、usingディレクティブ(VBの場合はImportsステートメント)を使って、クラスが所属する名前空間の宣言を「using <名前空間>;」の形式でコードの先頭にあらかじめ記述しておくことで、名前空間を省略してそのクラスが使えるようになる。

 Windowsアプリケーションのひな型コードでは、System.Windows.Forms名前空間だけでなく、さまざまな名前空間が宣言されている。これらの名前空間とその内容を次の表にまとめた(ただし、表の内容欄に書かれている用語の説明は割愛させていただく)。

名前空間 内容
System データ型、イベント、インターフェイス、属性、処理例外を定義する基本的なクラスが含まれている名前空間
System.Collections.Generic リスト、キュー、ディクショナリなど、オブジェクトのさまざまなコレクションを定義するインターフェイスとクラスが含まれている名前空間
System.Windows.Forms Windowsアプリケーションを作成するためのクラスが含まれている名前空間
System.ComponentModel コンポーネントとコントロールの実行時およびデザイン時の動作を実装するためのクラスが含まれている名前空間
System.Data データベースやXMLの処理を行うためのクラスが含まれている名前空間
System.Drawing グラフィックス機能を使うためのクラスが含まれている名前空間
System.Text 文字列を操作するためのクラスが含まれている名前空間
System.Linq LINQ(Language-Integrated Query:統合言語クエリ)を使用した問い合わせ構文を記述するのに必要なクラスが含まれている名前空間
System.Windows.Forms Windowsアプリケーションを作成するためのクラスが含まれている名前空間
ひな型コードに追加されるusingディレクティブによる名前空間の宣言(C#)

 なお、ここまでの説明で、冒頭にあった「Application.EnableVisualStyles();」と「Application.SetCompatibleTextRenderingDefault(false);」も、System.Windows.Forms名前空間Applicationクラスの静的メソッドであることが分かっただろう。

 それでは次に、このApplication.Runメソッドは実際にはどのような処理を行っているかについて解説しよう。


 INDEX
  [フレッシュマン企画 連載]簡単!Visual Studio 2008入門
  第4回 Visual Studio 2008のひな型コードを理解する
  1.Mainメソッドの内容の理解
    2.Application.Runメソッドの理解
    3.Windowsフォーム・デザイナで生成されたコード
    4.ひな型コード全体の流れ

インデックス・ページヘ  「簡単!Visual Studio 2008入門」


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 記事ランキング

本日 月間