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

フィールドとは、クラスまたは構造体で直接宣言される任意の型の変数です。A field is a variable of any type that is declared directly in a class or struct. フィールドは、それを含んでいる型のメンバーです。Fields are members of their containing type.

クラスまたは構造体には、インスタンス フィールドと静的フィールドのいずれか、またはその両方が含まれる場合があります。A class or struct may have instance fields or static fields or both. インスタンス フィールドは、型のインスタンスに固有です。Instance fields are specific to an instance of a type. たとえば、クラス T と、そのクラスのインスタンス フィールド F があるとします。型 T のオブジェクトを 2 つ作成した場合、他方のオブジェクトの値に影響を与えることなく、各オブジェクトの F の値を変更できます。If you have a class T, with an instance field F, you can create two objects of type T, and modify the value of F in each object without affecting the value in the other object. これとは対照的に、クラス自体に属する静的フィールドは、そのクラスのすべてのインスタンスで共有されます。By contrast, a static field belongs to the class itself, and is shared among all instances of that class. インスタンス A に加えられた変更は、インスタンス B と C がフィールドにアクセスした場合、これらのインスタンスでただちに確認されます。Changes made from instance A will be visibly immediately to instances B and C if they access the field.

通常、フィールドは、プライベートまたは保護されたアクセシビリティを持つ変数に対してのみ使用します。Generally, you should use fields only for variables that have private or protected accessibility. クラスからクライアント コードに公開するデータは、メソッドプロパティインデクサーを使用して提供する必要があります。Data that your class exposes to client code should be provided through methods, properties and indexers. これらの構成要素を使用して、内部フィールドに間接的にアクセスすることで、無効な値が入力されることを防止できます。By using these constructs for indirect access to internal fields, you can guard against invalid input values. パブリック プロパティによって公開されるデータを格納するプライベート フィールドは、バッキング ストアまたはバッキング フィールドと呼ばれます。A private field that stores the data exposed by a public property is called a backing store or backing field.

一般に、フィールドは、複数のクラス メソッドからアクセスできるようにする必要があり、かつ 1 つのメソッドの有効期間より長く保持する必要があるデータを格納します。Fields typically store the data that must be accessible to more than one class method and must be stored for longer than the lifetime of any single method. たとえば、暦の日付を表すクラスには、月、日、年を表す 3 つの整数フィールドが存在します。For example, a class that represents a calendar date might have three integer fields: one for the month, one for the day, and one for the year. 1 つのメソッドのスコープ外で使用されることのない変数は、メソッド本体内でローカル変数として宣言する必要があります。Variables that are not used outside the scope of a single method should be declared as local variables within the method body itself.

フィールドは、フィールドのアクセス レベル、フィールドの型、フィールドの名前の順に指定して、クラス ブロック内で宣言します。Fields are declared in the class block by specifying the access level of the field, followed by the type of the field, followed by the name of the field. 次に例を示します。For example:

   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 
           {
               // Set some reasonable boundaries for likely birth dates.
               if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
               {
                   date = value;
               }
               else
                   throw new ArgumentOutOfRangeException();
           }

       }

       // Public method also exposes date field safely.
       // Example call: birthday.SetDate("1975, 6, 30");
       public void SetDate(string dateString)
       {
           DateTime dt = Convert.ToDateTime(dateString);

           // Set some reasonable boundaries for likely birth dates.
           if (dt.Year > 1900 && dt.Year <= DateTime.Today.Year)
           {
               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 のように、オブジェクト名の後にピリオドを追加し、その後にフィールド名を続けます。To access a field in an object, add a period after the object name, followed by the name of the field, as in objectname.fieldname. 次に例を示します。For example:

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

フィールドには、フィールドの宣言時に代入演算子を使用して初期値を指定できます。A field can be given an initial value by using the assignment operator when the field is declared. たとえば、day フィールドに "Monday" を自動的に代入するには、次の例のように day を宣言します。To automatically assign the day field to "Monday", for example, you would declare day as in the following example:

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

フィールドは、オブジェクト インスタンスのコンストラクターが呼び出される直前に初期化されます。Fields are initialized immediately before the constructor for the object instance is called. コンストラクターがフィールドの値を代入すると、フィールドの宣言時に指定された値はすべて上書きされます。If the constructor assigns the value of a field, it will overwrite any value given during field declaration. 詳細については、「コンストラクターの使用」を参照してください。For more information, see Using Constructors.

注意

フィールドの初期化子は、他のインスタンス フィールドを参照できません。A field initializer cannot refer to other instance fields.

フィールドは、publicprivateprotectedinternalprotected internal または private protected としてマークできます。Fields can be marked as public, private, protected, internal, protected internal or private protected. これらのアクセス修飾子により、クラスのユーザーがフィールドにアクセスする方法が定義されます。These access modifiers define how users of the class can access the fields. 詳細については、「アクセス修飾子」を参照してください。For more information, see Access Modifiers.

必要に応じて、フィールドを静的に宣言することもできます。A field can optionally be declared static. その場合、クラスのインスタンスが存在しなくても、呼び出し元がいつでもフィールドを使用できるようになります。This makes the field available to callers at any time, even if no instance of the class exists. 詳細については、「静的クラスと静的クラス メンバー」を参照してください。For more information, see Static Classes and Static Class Members.

フィールドを readonly として宣言することもできます。A field can be declared readonly. 読み取り専用フィールドには、初期化時またはコンストラクターによる以外は、値を代入できません。A read-only field can only be assigned a value during initialization or in a constructor. static readonly フィールドは基本的に定数と同じですが、C# コンパイラが静的な読み取り専用フィールドの値にアクセスできるのは実行時のみで、コンパイル時はアクセスできない点が異なります。A static readonly field is very similar to a constant, except that the C# compiler does not have access to the value of a static read-only field at compile time, only at run time. 詳細については、「定数」を参照してください。For more information, see Constants.

C# 言語仕様C# Language Specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

関連項目See also