先ほどの解説では、メソッドを定義する方法を示した。次に定義済みのメソッドを使用する方法を簡単に紹介しておこう。といっても難しくはない。メソッドの使用パターンは、次の図のパターン1のように「処理結果である戻り値を変数に代入するか」、パターン2のように「戻り値を無視するか(結果は不要で、メソッドの処理だけを実行するか)」の2とおりしかない。
上の図にある変数の型とは、変数の種類(例えば、数値、文字例、Windowsフォーム、ボタン・コントロールなどのクラスの種類)のことである。また変数とは、値(=データ)を格納するための領域(=データを格納する箱のようなもの)である。例えば「int num;」と記述した場合、int型(=数値型)のnum変数ということになる。
「=」は代入するという意味なので、パターン1の「変数の型 変数 = DoSomeWork(パラメータ1, パラメータ2……)」は「パラメータ1、パラメータ2の入力を渡してDoSomeWorkメソッドの処理を行わせ、その処理結果を戻り値として受け取って(変数の型の)変数に代入する」という意味になる。
メソッドの最後にある「;(セミコロン)」は、C#でプログラム上の1文(1ステートメント)を区切るためのキーワードである。つまり、1行に「;」を複数記述すれば、1行内に複数の文を記述できるし、複数行の最後に「;」を1つ記述されば、複数行に1つの文を記述できる(VB.NETは改行により1文を区切るため、常に1行=1文となる。なお改行の最後に「_」を付加して連結すれば、VB.NETでも複数行にまたがる1文を記述することは可能)。
それでは再度、Mainメソッドに話を元に戻し、Mainメソッドの処理内容について見ていくことにしよう。
……前略……
using System.Windows.Forms;
……中略……
namespace WindowsApplication1
{
……中略……
public class Form1 : System.Windows.Forms.Form
{
……中略……
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
}
}
Mainメソッドのスコープを見ると、次のような1文があるだけだ。
Application.Run(new Form1());
この1文の内容は複雑そうに見えるかもしれないが、実はこれも先ほど説明したメソッドである。ただし、この1文には2つのメソッドが1つに組み合されて使用されているため、ややこしく見える。これを2つに分割すると、次のようになる。
(1) Application.Run(<オブジェクト>)
(2) <オブジェクト> = new Form1()
メソッドが実行される順番は、(1)の中にある(2)が先に実行され、次に(1)が実行される。よって、この順番で解説していこう。
まず(2)は、Form1クラスのインスタンスを作るためのメソッドである(前述のメソッド使用パターン1のケース)。ただしこのメソッドは、次の2点で普通のメソッドとは異なる特殊なメソッドである。
「new <クラスの名称>()」という構文のように先頭に、new演算子(VB.NETではNew演算子)が付くメソッドはクラスのインスタンスを作成するためのもので、このようなメソッドはコンストラクタと呼ばれる。実はオブジェクト指向では、このコンストラクタ・メソッドこそがオブジェクトを生成するための仕組みである。
Windowsフォームのひな形コードでは、アプリケーション実行のきっかけとしてMainメソッドが呼ばれ、最初にこのForm1コンストラクタでForm1オブジェクトが作成される。この後はこのForm1オブジェクトからさまざまなオブジェクトを生成して、アプリケーションが動作するというわけである。
次に(1)の「Application.Run(<オブジェクト>)」メソッドは、(2)で生成されたForm1オブジェクトをパラメータ(入力)として受け取っている。戻り値はvoid(=なし)なので(戻り値の内容については、VS.NETのヘルプであるMSDNライブラリに掲載されている。Application.Run メソッドについては、MSDNの「Application.Run メソッド (Form)」を参照するとよい。MSDNライブラリの参照方法は次回以降で解説する)、Runメソッドの戻り値は無視している(前述のメソッド使用パターン2のケース)。
この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.NETの場合はImportsステートメント)を使って、クラスが所属する名前空間の宣言を「using <名前空間>;」の形式でコードの先頭にあらかじめ記述しておくことで、名前空間を省略してそのクラスが使えるようになる。
Windowsアプリケーションのひな形コードでは、System.Windows.Forms名前空間だけでなく、さまざまな名前空間が宣言されている。これらの名前空間とその内容を次の表にまとめた(ただし、表の内容欄に書かれている用語の説明は割愛させていただく)。
名前空間 | 内容 |
---|---|
System | データ型、イベント、インターフェイス、属性、処理例外を定義する基本的なクラスが含まれている名前空間。 |
System.Drawing | グラフィックス機能を使うためのクラスが含まれている名前空間。 |
System.Collections | リスト、キュー、配列、ハッシュ・テーブル、ディクショナリなど、オブジェクトのさまざまなコレクションを定義するインターフェイスとクラスが含まれている名前空間。 |
System.ComponentModel | コンポーネントとコントロールの実行時とデザイン時の動作を実装するためのクラスが含まれている名前空間。 |
System.Windows.Forms | Windowsアプリケーションを作成するためのクラスが含まれている名前空間。 |
System.Data | データベースやADO.NETの処理を行うためのクラスが含まれている名前空間。 |
ひな形コードに追加されるusingディレクティブによる名前空間の宣言(C#) |
それでは次に、このApplication.Runメソッドは実際にはどのような処理を行っているかについて解説しよう。
Copyright© Digital Advantage Corp. All Rights Reserved.