次の方法で共有


フィールド (C# プログラミング ガイド)

更新 : 2007 年 11 月

フィールドとは、クラスまたは構造体で直接宣言される任意の型の変数です。フィールドは、それを含んでいる型のメンバです。

クラスや構造体には、インスタンス フィールドと静的フィールドのいずれかまたは両方が含まれていることがあります。インスタンス フィールドは、型のインスタンスに固有になります。たとえば、クラス T と、そのクラスのインスタンス フィールド F があるとします。型 T のオブジェクトを 2 つ作成した場合、他方のオブジェクトの値には影響を与えずに、各オブジェクトの F の値を変更できます。これとは対照的に、クラス自体に属する静的フィールドは、そのクラスのすべてのインスタンスで共有されます。インスタンス A に変更が加えられると、インスタンス B と C においても、それらのインスタンスがフィールドにアクセスした場合にすぐに確認できる形で反映されます。

通常、フィールドは、プライベートまたはプロテクトのアクセシビリティを持つ変数にのみ使用します。クラスからクライアント コードに公開するデータは、メソッドプロパティ、およびインデクサを使用して提供する必要があります。これらの構成要素を内部フィールドへの間接アクセスとして使用することで、無効な値が入力されることを防止できます。パブリック プロパティによって公開されるデータを格納するプライベート フィールドは、バッキング ストアまたはバッキング フィールドと呼ばれます。

一般に、フィールドには、複数のクラス メソッドからアクセスできるようにする必要があり、かつ 1 つのメソッドの有効期間よりも長く保持する必要のあるフィールドを格納します。たとえば、暦の日付を表すクラスには、月、日、年を表す 3 つの整数フィールドが存在します。1 つのメソッドのスコープ外で使用されることのない変数は、メソッド本体の内部でローカル変数として宣言する必要があります。

フィールドは、フィールドのアクセス レベル、フィールドの型、フィールドの名前を順に指定して、クラス ブロック内で宣言します。次に例を示します。

public class CalendarEntry
{
    // private field
    private DateTime date;

    // public field (Generally not recommended)
    public string day;

    // Public property exposes date field safely.
    public DateTime Date 
    {
        get 
        {
            return date;
        }
        set 
        {
            if(value.Year > 1980 || value.Year <= 2008)
            {
                date = value;
            }
            else
                throw new ArgumentOutOfRangeException();
        }

    }

    // Public method also exposes date field safely.
    public void SetDate(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        if (dt.Year > 1980 || dt.Year <= 2008)
        {
            date = dt;
        }
        else
            throw new ArgumentOutOfRangeException();            
    }

    public TimeSpan GetTimeSpan(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        if (dt != null && dt.Ticks < date.Ticks)
        {
            return date - dt;
        }
        else
            throw new ArgumentOutOfRangeException();  

    }
}

オブジェクト内のフィールドにアクセスするには、objectname.fieldname のように、オブジェクト名の後にピリオドを追加し、その後にフィールド名を続けます。次に例を示します。

CalendarEntry birthday = new CalendarEntry();
birthday.day = "Saturday";

フィールドには、フィールドの宣言時に代入演算子を使用して初期値を設定できます。たとえば、day フィールドに自動的に "Monday" を代入するには、次の例のように day を宣言します。

public class CalendarDateWithInitialization
{
    public string day = "Monday";
    //...
}

フィールドは、オブジェクト インスタンスのコンストラクタが呼び出される直前に初期化されます。コンストラクタがフィールドの値を代入すると、フィールドの宣言中に指定された値はすべて上書きされます。詳細については、「コンストラクタの使用 (C# プログラミング ガイド)」を参照してください。

ms173118.alert_note(ja-jp,VS.90).gifメモ :

フィールド初期化子は、他のインスタンス フィールドを参照できません。

フィールドは、publicprivateprotectedinternal、または protected internal とマークできます。これらのアクセス修飾子により、クラスのユーザーがフィールドにどのようにアクセスできるかが定義されます。詳細については、「アクセス修飾子 (C# プログラミング ガイド)」を参照してください。

フィールドは、static と宣言することもできます。このように宣言すると、クラスのインスタンスが存在しない場合でも、呼び出し元がいつでもフィールドにアクセスできます。詳細については、「静的クラスと静的クラス メンバ (C# プログラミング ガイド)」を参照してください。

フィールドは、readonly として宣言できます。読み取り専用フィールドには、初期化時またはコンストラクタでしか値を代入できません。staticreadonly フィールドは基本的に定数と同じですが、C# コンパイラは、このフィールドの値にはコンパイル時にアクセスできず、実行時にしかアクセスできません。詳細については、「定数 (C# プログラミング ガイド)」を参照してください。

C# 言語仕様

詳細については、「C# 言語仕様」の次のセクションを参照してください。

  • 1.6.5 フィールド

  • 10.5 フィールド

参照

概念

C# プログラミング ガイド

参照

クラスと構造体 (C# プログラミング ガイド)

コンストラクタの使用 (C# プログラミング ガイド)

継承 (C# プログラミング ガイド)

アクセス修飾子 (C# プログラミング ガイド)

抽象クラスとシール クラス、およびクラス メンバ (C# プログラミング ガイド)