フィールド
インスタンスが持つデータ
クラス本体にはオブジェクトが保有する機能の宣言を記述します。クラスなど、型を構成する内部要素を総称してメンバ(member)と呼ばれます。メンバにはいくつか種類がありますが、クラスのメンバにはフィールド、プロパティ、メソッド、イベントなどがあります。この場では、フィールドについて解説します。
オブジェクトが持つデータはフィールド(field)として宣言します。フィールドはクラスのメンバとして宣言された変数であり、インスタンスと直接結び付けられます。しばしば、メンバ変数と呼ばれることもあります。通常の変数と異なり、フィールドへのアクセスにはインスタンスが必要になります。
フィールド修飾子 型 変数宣言
フィールド修飾子(field modifiers)はフィールドの性質を指定する定められた修飾子を指定します。例えば、クラスのメンバにはアクセス制御の概念があり、 他のクラスからアクセスを許可するか、またはアクセスを禁止するかを修飾子で指定できます。この場では、どこからでも自由にアクセスを許可する public キーワードを指定してください。フィールド修飾子は省略できますが、省略すると他のクラスからはアクセスできません。
例えば、次のメンバ変数はどこからでもアクセス可能な文字型の変数です。
public string str;
フィールドはインスタンスごとに独自のメモリ領域を確保します。オブジェクトのサイズはフィールドで宣言されたデータを保存するために十分な領域が割り当てられます。32 ビットである int 型のフィールドを 2 つ持つインスタンスであれば、少なくとも 8 バイト以上のサイズがランタイムによって確保されています。
オブジェクトが持つフィールドに値を代入したり、保存している値を取り出したりするにはメンバアクセス(member access)を用います。メンバアクセスはドット記号 . で表されるメンバアクセス演算子(member access operator)からなる式です。
オブジェクト . メンバ
メンバアクセス演算子の左項にはメンバを持つオブジェクトを、右項にメンバの識別子を指定します。
class MagicalGirl { public string name; } class Test { public static void Main(string[] args) { MagicalGirl nanoha = new MagicalGirl(); nanoha.name = "高町なのは"; System.Console.WriteLine(nanoha.name); } }
コード1は MagicalGirl クラスを作成しています。このクラスには文字列型の name フィールドが含まれています。Main() メソッドで MagicalGirl クラスのインスタンスを作成して nanoha 変数にオブジェクトを保存しています。その後、メンバアクセス nanoha . name という形でフィールドにアクセスできます。フィールドは、オブジェクトが持つ状態そのものであり、フィールドに保存されているデータの寿命は、インスタンスの寿命と一致します。
フィールドはインスタンスごとに領域が確保されます。オブジェクトごとに独立したフィールドのデータが保持されます。
class MagicalGirl { public string name; } class Test { public static void Main(string[] args) { MagicalGirl nanoha = new MagicalGirl(); MagicalGirl fate = new MagicalGirl(); nanoha.name = "高町なのは"; fate.name = "フェイト・テスタロッサ"; System.Console.WriteLine(nanoha.name); System.Console.WriteLine(fate.name); } }
コード2の Main() メソッドでは nanoha 変数と fate 変数に new 演算子で作成した MagicalGirl オブジェクトを代入しています。nanoha 変数と fate 変数に保存されているインスタンスは異なるので、それぞれの name フィールドは異なる、独立した変数です。
フィールドの宣言は、アクセス修飾子を指定する点を除けばローカル変数とほぼ同じです。ローカル変数と同じように = 記号に続く初期化子を指定することで、フィールドの初期値を指定できます。インスタンスが生成されたとき、オブジェクトのフィールドは指定された値で初期化されています。
class MagicalGirl { public string name = "匿名希望"; } class Test { public static void Main(string[] args) { MagicalGirl unknown = new MagicalGirl(); System.Console.WriteLine(unknown.name); } }
コード3は name フィールドに対して初期化子を指定しています。オブジェクトが作られた時点で name フィールドの値は指定した文字列で初期化されています。