クラスについて
オブジェクト指向ではオブジェクトを表現するためにクラスというものが使われます。クラスとはオブジェクトの性質を定義するためのものです。C#.NETはオブジェクト指向言語なので当然クラス定義の記述が必要になります。
クラスを構成する要素にはクラス名、フィールド、メソッドといったものがあります。クラス名にはオブジェクトの性質を表すような名称を付けます。フィールドとはオブジェクトが内部状態を保持するためのクラス内部の変数のことです。そしてメソッドはオブジェクトが保持するフィールドの値を参照設定するための操作のことです。
例えば、「Human」というクラスを作るとするとフィールドとして氏名や生年月日、身長、体重、健康状態、機嫌といったオブジェクトの状態を示す変数が内部にあると考えられます。フィールドには概念的に外部に公開されているもの(氏名、生年月日、身長、体重など)と外部からは分からないもの(健康状態、機嫌など)に分類することができます。また、メソッドとして「食べる」や「仕事をする」といったフィールドの値に作用した動作を表すものや「名前を聞く」「名前を付ける」といったフィールドの値を取得、設定するもの(プロパティとかアクセサと呼びます)があります。C#.NETでは通常、フィールドは全て外部からは見えないようにして、アクセサを使って外部に公開するようにソースコードを記述します。(なぜそうするかは本当にオブジェクト指向のことが分かってくれば分かることなので、最初は理屈抜きで素直に「お作法」としてアクセサを使うようにしましょう。)下記にクラス定義のごく簡単な例を示します。
public class MyClass { //フィールド private int _x = 0; //コンストラクタ public MyClass() { } //アクセサ public int X { get { return _x; } set { _x = value; } } //メソッド public int SumX(int number) { return number + this.X; } }
クラス名は分かりやすい英単語のつながりでつけるのが一般的です。C#.NETではクラス名の先頭と各単語の先頭の文字は大文字にします。「class」というのがクラス定義のためのキーワードです。クラス定義の前に「public」というキーワードがあります。これはアクセス修飾子といい、「public」やら「private」といったものがありますが、通常はクラスはpublicで記述します。(アクセス修飾子の意味が分かるようになるまではクラス定義はpublicにするようにしておきましょう。)クラス定義は「{」と「}」でくくります。
クラス定義に最初にフィールドの定義があります。フィールドはアクセサを使って操作することを基本としますので、ここではアクセス修飾子を「private」にしてあります。そうすることでフィールドとして定義した変数のスコープをクラス内のみとすることができます。(すなわち外部から直接は見られないということです。)
次にコンストラクタという特殊なメソッドが記述してあります。これはクラスの初期化(フィールドに規定値を代入する等)するためのメソッドでオブジェクトが生成される際に自動的に呼び出されます。
その次にはアクセサの例が記述してあります。アクセサはフィールドの値の参照や設定に使用され、「=」演算子を使ったときに呼び出されます。例えば「a = myObject.X」と記述するとgetが呼び出され、「myObject.X = 5」と記述するとsetが呼び出されます。setの「value」という変数には「=」演算子の右側の値(先の例の場合は5)が自動的に入っています。
メソッドの例として「SumX」というメソッドを示しました。引数に整数を与えると「X」の値と足した値を返すという動作をします。
上記はクラス定義の例でしたが、クラス定義しただけではまだクラスは使われていません。実際はクラス定義を元にオブジェクトを生成し、その生成したオブジェクト(インスタンスと呼びます)に対して操作していきます。クラスからインスタンスを生成して利用する例を下記に示します。
public class StartUp { //エントリポイント static void Main() { MyClass myObject = new MyClass(); myObject.X = 5; int a = myObject.SumX(10); } }
C#.NETではプログラムで一番最初に呼び出されるメソッド名を「Main」という名前にするように決められています。ソースコードを記述する際はプログラム(プロジェクト)全体で1つ必ず「Main」というメソッドを記述して下さい。先頭についているアクセス修飾子「static」はインスタンスを生成しなくても呼び出せるメソッドという意味ですが、今はおまじないのつもりで見ておいてください。
メソッド内ではまず、「new」というキーワードを使ってインスタンス生成しています。このときにクラス定義に記述したコンストラクタという初期化のためのメソッドが呼び出されます。そして、生成されたインスタンス(正確にはインスタンスへの参照)をMyClass型の変数myObjectに代入しています。次にmyObjectのプロパティ(アクセサ)Xに5を設定した後、「SumX」というメソッドを実行しています。
このように通常、オブジェクトはクラス定義を元にインスタンスを生成しないと使えないということを覚えておいてください。インスタンスの生成については本当はもっと難しい話(ガベージコレクタが管理しているヒープ領域にメモリが確保され・・・)もあるのですが、ここでは割愛したいと思います。