クラスについて説明を終えたところで、前回は説明を後回しにしていたオブジェクトの作成について解説します。ここからは、前回解説した“オブジェクトを操作するためのプログラミング”の続きとなります。
■オブジェクトの生成
前回での「オブジェクトの操作」と同様に、オブジェクトの参照用に用意した変数myForm1があるとします。オブジェクトの作成は、次のように「new」キーワードを使用し、それに続けてクラス名をカッコ付きで記述します。
先ほどのクラス定義の例では、コンストラクタであるFormメソッドを記述しましたが(C#の場合)、オブジェクトの作成は、newを付けてコンストラクタを呼び出していると考えることもできます(VB.NETのコンストラクタは、なぜかNewという特別な名前ですが……)。
上記の記述により、Formクラスを基にしたオブジェクトがメモリ上に1つ作成されます。そして、このタイミングでコンストラクタに記述したコードが実行されることになります。
「new+コンストラクタの呼び出し」は、作成したオブジェクトへの参照を返します。その参照を、ここでは変数myForm1の値として代入しています。
いま、Formクラスを“newして”オブジェクトを作成しました。この場合には、このオブジェクトは「Formオブジェクト」と呼ばれます。変数myForm1は、Formオブジェクトを参照している変数です。このため「myForm1はFormオブジェクトである」といいます。
また、あるクラスに対してnewによりオブジェクトを作成することを、「クラスのインスタンスを作成する」あるいは「クラスのインスタンス化」と呼ぶこともあります。
たいていの場合、インスタンスはオブジェクトと同じ意味で用いられますが、「Formオブジェクト」ということはあっても、「Formインスタンス」とはあまりいいません。「Formクラスをインスタンス化してFormオブジェクトを作成する」というのは正しいいい方です。
■Formオブジェクト用の変数はForm型
実はもう1つ、前回では触れなかった点があります。ここまでmyForm1という名前の変数が登場してきましたが、変数はすべて「型」を持っています。
変数myForm1は、Formクラスから作成されたオブジェクトへの参照を入れるための変数でした。この場合には、myForm1の型は「Form型」となります。基本的に、変数の型は、その変数が参照するオブジェクトのクラスと同じ名前になります(同じにならない場合もあります。これについては次回以降で解説します)。
そして、変数を使用する前には、まず型を指定して変数名を宣言する必要があります。変数の宣言は、次のようにして記述します。この1行は、「いまからmyForm1という名前の変数を使います、これにはFormオブジェクトへの参照を代入するつもりです」という宣言です。
このようにして宣言された変数には、その型と同じ名前のクラスから作成されたオブジェクトへの参照を代入できます。
変数を宣言し、すぐ続けてオブジェクトを作成するということはよくあります。このような場合には、次のようにして2つの処理を1つの行で記述することもできます。
ここまでで、オブジェクトを作成して、それを操作するまでの一連のコードがほぼそろったことになります。前回で解説したコードとつなぎ合わせてまとめておきましょう。
■コードはメソッドの中にのみ存在
ところで、ここまでの解説では、
(A)クラスの定義時にメソッドの処理を記述するコード
(B)クラスからオブジェクトを作り、それを操作するコード
という、あたかも2つの種類のコードが存在するような説明をしてきました。しかし、実際には、すべてのコード(処理を記述したコード)はメソッドの中にしか書けません。そしてメソッドはクラスの中にしか書けません。
つまり、いま作成した上記(B)のようなコードも、実際にはメソッドで囲って、さらにクラスで囲む必要があります。ここでは、次のような適当なクラスとメソッドに当てはめてみましょう。
これで、正式なC#およびVB.NETのプログラムとなりました(このコードは実際にコンパイルすることができます)。
以上のように、C#やVB.NETのプログラミングというのは、ひたすらクラスを定義していくということになります。
ちなみに、上記のコードでは、メソッド内で宣言している変数myForm1も、フィールドと同様に内部データであるといえます。しかしこの変数の内容は、メソッドが呼び出されて、メソッドを抜けるまでの間でのみ有効な一時的なデータです。
一方、オブジェクトのフィールドに格納されたデータは、オブジェクトがメモリ上から消去されるまで保持されます。オブジェクトの消去は、そのオブジェクトがどこからも参照されなくなった後、自動的に行われます(誰も参照していないオブジェクトは誰も操作しないので残しておく必要はありません)。
2つのクラスが完成したので、次のページではこれらをコンパイルして実行してみます。
Copyright© Digital Advantage Corp. All Rights Reserved.