WisdomSoft - for your serial experiences.

フィールド

フィールド宣言とメンバアクセスによるフィールドの活用方法を紹介します。フィールドはクラスのメンバとして宣言された変数であり、インスタンスと直接結び付けられます。

インスタンスが持つデータ

クラス本体にはオブジェクトが保有する機能の宣言を記述します。クラスなど、型を構成する内部要素を総称してメンバ(member)と呼ばれます。メンバにはいくつか種類がありますが、クラスのメンバにはフィールド、プロパティ、メソッド、イベントなどがあります。この場では、フィールドについて解説します。

オブジェクトが持つデータはフィールド(field)として宣言します。フィールドはクラスのメンバとして宣言された変数であり、インスタンスと直接結び付けられます。しばしば、メンバ変数と呼ばれることもあります。通常の変数と異なり、フィールドへのアクセスにはインスタンスが必要になります。

フィールド宣言
フィールド修飾子  変数宣言

フィールド修飾子(field modifiers)はフィールドの性質を指定する定められた修飾子を指定します。例えば、クラスのメンバにはアクセス制御の概念があり、 他のクラスからアクセスを許可するか、またはアクセスを禁止するかを修飾子で指定できます。この場では、どこからでも自由にアクセスを許可する public キーワードを指定してください。フィールド修飾子は省略できますが、省略すると他のクラスからはアクセスできません。

例えば、次のメンバ変数はどこからでもアクセス可能な文字型の変数です。

public string  str;

フィールドはインスタンスごとに独自のメモリ領域を確保します。オブジェクトのサイズはフィールドで宣言されたデータを保存するために十分な領域が割り当てられます。32 ビットである int 型のフィールドを 2 つ持つインスタンスであれば、少なくとも 8 バイト以上のサイズがランタイムによって確保されています。

オブジェクトが持つフィールドに値を代入したり、保存している値を取り出したりするにはメンバアクセス(member access)を用います。メンバアクセスはドット記号 . で表されるメンバアクセス演算子(member access operator)からなる式です。

メンバアクセス
オブジェクト . メンバ

メンバアクセス演算子の左項にはメンバを持つオブジェクトを、右項にメンバの識別子を指定します。

コード1
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 実行結果

コード1は MagicalGirl クラスを作成しています。このクラスには文字列型の name フィールドが含まれています。Main() メソッドで MagicalGirl クラスのインスタンスを作成して nanoha 変数にオブジェクトを保存しています。その後、メンバアクセス nanoha . name という形でフィールドにアクセスできます。フィールドは、オブジェクトが持つ状態そのものであり、フィールドに保存されているデータの寿命は、インスタンスの寿命と一致します。

フィールドはインスタンスごとに領域が確保されます。オブジェクトごとに独立したフィールドのデータが保持されます。

コード2
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 実行結果

コード2の Main() メソッドでは nanoha 変数と fate 変数に new 演算子で作成した MagicalGirl オブジェクトを代入しています。nanoha 変数と fate 変数に保存されているインスタンスは異なるので、それぞれの name フィールドは異なる、独立した変数です。

フィールドの宣言は、アクセス修飾子を指定する点を除けばローカル変数とほぼ同じです。ローカル変数と同じように = 記号に続く初期化子を指定することで、フィールドの初期値を指定できます。インスタンスが生成されたとき、オブジェクトのフィールドは指定された値で初期化されています。

コード3
class MagicalGirl
{
    public string name = "匿名希望";
}

class Test
{
    public static void Main(string[] args)
    {
        MagicalGirl unknown = new MagicalGirl();
        System.Console.WriteLine(unknown.name);
    }
}
実行結果
コード3 実行結果

コード3は name フィールドに対して初期化子を指定しています。オブジェクトが作られた時点で name フィールドの値は指定した文字列で初期化されています。