第4回 Visual Studio 2017のひな型コードを理解する:連載:簡単! Visual Studio 2017入門(1/4 ページ)
開発環境が自動生成するWindowsアプリケーションのひな型コード。これをマスターして本格的なVisual Studio開発に乗り出そう。
※本連載は、「簡単! Visual Studio 2015入門」「簡単! Visual Studio 2013入門」「簡単! Visual Studio 2010入門」「簡単! Visual Studio 2008入門」「簡単! Visual Studio 2005入門」「簡単! Visual Studio .NET入門」を現在の最新環境に合わせて改訂したものです。
今回は、前回に引き続き、Visual Studio 2017(以降、VS 2017)でWindowsアプリ(以降、Winアプリ)のプロジェクトを新規作成したときに自動生成される初期コード(以降、ひな型コード)を見ながら、Mainメソッドの処理内容から、プログラム全体のコード内容までを一通り解説する。
Mainメソッドの内容の理解
まずは、Mainメソッドの処理内容について見ていくことにしよう。前回も示したが、MainメソッドはProgram.csファイルの中にある。
…… 前略 ……
using System.Windows.Forms;
namespace WindowsFormsApp1
{
static class Program
{
…… 中略 ……
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
Mainメソッドのスコープを参照すると、「Application.Run(new Form1());」という一文がある。これがMainメソッドの肝となる処理内容である。なお、「static class Program」については前回説明済み。
Mainメソッドのスコープを見ると、まず次のような文がある。
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
これらの文の詳細な説明は(.NET初学者には不要と思われるので)割愛するが、何のためのコードか分からないとすっきりしないと思うので、その意味だけを簡単に述べておく。
アプリの概観を設定したり、描画方法を指定したりするための設定
「Application.EnableVisualStyles();」はボタン、ウィンドウやテキストボックスなどのコントロールの外観をWindows XP/Vista/7/8/10のスタイルに変更するためのものである(詳しくは「.NET TIPS:WindowsアプリをWindows XPスタイルの外観にするには?」を参照)。参考までに、この行がなかった場合にコントロールの外観がどのようになるかを以下に示す。
Application.EnableVisualStylesメソッドの有無によるコントロールの外観の違い
左はこのメソッドを呼び出した場合で、右は呼び出さなかった場合(ともにWindows 10での実行結果)。
一方、「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との互換性がなくなるので、注意が必要である。
Form1クラスのインスタンスの作成と実行
続いて次の一文がある。
Application.Run(new Form1());
実はこの一文では、2つのメソッドが1つに組み合わされて使用されている。これを2つに分解すると、次のようになる。
- Application.Run(<オブジェクト>)
- <オブジェクト> = 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 2017のヘルプであるMSDNライブラリを参照するが、その参照方法については次回以降で詳しく説明する。上記のApplication.Runメソッドについては、オンライン版MSDNの「Application.Runメソッド (Form)」を参照するとよい。
静的メソッドはクラスを用いて呼び出す
このApplication.Runメソッドも、Mainメソッドと同じく静的メソッドである。つまり、オブジェクトがなくてもメソッドを呼び出せる。それでは、「.」で接続された「Application」はオブジェクトではないのか? という疑問を持つ読者がいるかもしれない。
しかし、この「Application」はオブジェクトではなく、クラスである。つまり、「Application.Run(<オブジェクト>)」というコードは、ApplicationクラスのRunメソッド(静的メソッド)を呼び出しているということである。このコードで使われている静的メソッドの呼び出し形式を構文としてまとめると、次のようになる。
<クラス名>.メソッド名(パラメーター);
一方、クラスのオブジェクトを経由して、動的メソッド(=静的メソッド以外のメソッド)を呼び出す形式を構文としてまとめると、次のようになる。
変数の型 オブジェクト変数 = new <クラス名>();
オブジェクト変数.メソッド名(パラメーター);
つまり、通常のメソッドについていえば、必ずコンストラクタでオブジェクト生成してから、生成されたそのオブジェクトを経由してメソッドを呼び出す必要がある。それに対し、静的メソッドの呼び出しでは、オブジェクトを生成せずに、クラスの中のメソッドを直接呼び出すことになる。よって、静的メソッドであるRunメソッドは「Application.Run(<オブジェクト>) 」という呼び出し形式になっている。
usingディレクティブにより名前空間を省略してコードを記述する
このApplicationクラスは、.NETのクラスライブラリに用意されているクラスで、System.Windows.Forms名前空間にある。しかし、上の「Application.Run(<オブジェクト>)」というコードでは、「System.Windows.Forms.Application」のように名前空間を付けずに呼び出している。このように名前空間なしでクラスを使用できる理由は、そのクラスが存在する名前空間が事前に宣言されているからだ。具体的には、ソースコードの先頭にある次の記述があるためである。
using System.Windows.Forms;
これにより、System.Windows.Forms名前空間に含まれるクラスは名前空間を省略して使用できるようになる。
C#では、usingディレクティブ(VBの場合はImportsステートメント)を使って、クラスが所属する名前空間の宣言を「using <名前空間>;」(VBの場合は「Imports <名前空間>」)という形式でコードの先頭にあらかじめ記述しておくことで、名前空間を省略してそのクラスが使えるようになる。
Windowsアプリのひな型コードでは、System.Windows.Forms名前空間だけでなく、さまざまな名前空間が宣言されている。これらの名前空間とその内容を次の表にまとめた(ただし、表の内容欄に書かれている用語の説明は割愛させていただく)。
名前空間 | 内容 |
---|---|
System | データ型、イベント、インタフェース、属性、処理例外を定義する基本的なクラスが含まれている名前空間 |
System.Collections.Generic | リスト、キュー、ディクショナリなど、オブジェクトのさまざまなコレクションを定義するインタフェースとクラスが含まれている名前空間 |
System.ComponentModel | コンポーネントとコントロールの実行時およびデザイン時の動作を実装するためのクラスが含まれている名前空間 |
System.Data | データベースやXMLの処理を行うためのクラスが含まれている名前空間 |
System.Drawing | グラフィックス機能を使うためのクラスが含まれている名前空間 |
System.Linq | LINQ(Language-Integrated Query:統合言語クエリ)を使用した問い合わせ構文を記述するのに必要なクラスが含まれている名前空間 |
System.Text | 文字列を操作するためのクラスが含まれている名前空間 |
System.Threading.Tasks | 同時実行されるコードや非同期に実行されるコードを記述するのに役立つ型が含まれている名前空間 |
System.Windows.Forms | Windowsアプリを作成するためのクラスが含まれている名前空間 |
usingディレクティブによってひな型コードに追加される名前空間 |
なお、ここまでの説明で、冒頭にあった「Application.EnableVisualStyles();」と「Application.SetCompatibleTextRenderingDefault(false);」も、System.Windows.Forms名前空間Applicationクラスの静的メソッドの呼び出しであることが分かっただろう。
それでは次に、Mainメソッドで最も重要なApplication.Runメソッドは実際にはどのような処理を行っているかについて解説しよう。
Copyright© Digital Advantage Corp. All Rights Reserved.