フィールドは、クラスまたは構造体で直接宣言される任意の型の変数です。 フィールドは、その包含型の メンバー です。
クラスまたは構造体には、インスタンス フィールド、静的フィールド、またはその両方が含まれる場合があります。 インスタンス フィールドは、型のインスタンスに固有です。 インスタンス フィールドがT
クラス F
がある場合は、T
型の 2 つのオブジェクトを作成し、他のオブジェクトの値に影響を与えずに各オブジェクトのF
の値を変更できます。 これに対し、静的フィールドは型自体に属し、その型のすべてのインスタンス間で共有されます。 静的フィールドには、型名を使用してのみアクセスできます。 静的フィールドにインスタンス名でアクセスすると、 CS0176 コンパイル時エラーが発生します。
一般に、フィールドの private
または protected
アクセシビリティを宣言する必要があります。 型がクライアント コードに公開するデータは、メソッド、プロパティ、インデクサーを使用して提供する必要があります。 内部フィールドへの間接アクセスにこれらのコンストラクトを使用すると、無効な入力値から保護できます。 パブリック プロパティによって公開されるデータを格納するプライベート フィールドは、 バッキング ストア または バッキング フィールドと呼ばれます。
public
フィールドを宣言することはできますが、型を使用するコードでそのフィールドを無効な値に設定したり、オブジェクトのデータを変更したりできないようにすることはできません。
通常、フィールドには、複数の型メソッドからアクセスできる必要があり、1 つのメソッドの有効期間よりも長く格納する必要があるデータが格納されます。 たとえば、カレンダーの日付を表す型には、3 つの整数フィールドがあります。1 つは月、1 つは日、1 つは年用です。 1 つのメソッドの範囲外で使用されない変数は、メソッド本体自体内で ローカル変数 として宣言する必要があります。
フィールドは、アクセス レベルを指定し、その後に型を続けてフィールドの名前を指定することで、クラスまたは構造体ブロックで宣言されます。 例えば次が挙げられます。
public class CalendarEntry
{
// private field (Located near wrapping "Date" property).
private DateTime _date;
// 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("Date");
}
}
}
// public field (Generally not recommended).
public string? Day;
// 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("dateString");
}
}
public TimeSpan GetTimeSpan(string dateString)
{
DateTime dt = Convert.ToDateTime(dateString);
if (dt.Ticks < _date.Ticks)
{
return _date - dt;
}
else
{
throw new ArgumentOutOfRangeException("dateString");
}
}
}
インスタンス内のフィールドにアクセスするには、インスタンス名の後にピリオドを追加し、 instancename._fieldName
のようにフィールドの名前を追加します。 例えば次が挙げられます。
CalendarEntry birthday = new CalendarEntry();
birthday.Day = "Saturday";
フィールドの宣言時に代入演算子を使用して、フィールドに初期値を指定できます。 たとえば、 Day
フィールドを "Monday"
に自動的に割り当てるには、次の例のように Day
を宣言します。
public class CalendarDateWithInitialization
{
public string Day = "Monday";
//...
}
フィールドは、オブジェクト インスタンスのコンストラクターが呼び出される直前に初期化されます。 コンストラクターがフィールドの値を割り当てると、フィールド宣言中に指定された値が上書きされます。 詳細については、「コンストラクターの 使用」を参照してください。
注
フィールド初期化子は、他のインスタンス フィールドを参照できません。
フィールドは、 public
、 private
、 protected
、 internal
、 protected internal
、または private protected
としてマークできます。 これらのアクセス修飾子は、型のユーザーがフィールドにアクセスする方法を定義します。 詳細については、「 アクセス修飾子」を参照してください。
必要に応じて、フィールドを static
宣言できます。 静的フィールドは、型のインスタンスが存在しない場合でも、呼び出し元がいつでもアクセスできます。 詳細については、「 静的クラスと静的クラス メンバー」を参照してください。
フィールドは readonly
宣言できます。 読み取り専用フィールドには、初期化中またはコンストラクター内でのみ値を割り当てることができます。
static readonly
フィールドは定数に似ていますが、C# コンパイラはコンパイル時にのみ、実行時にのみ静的読み取り専用フィールドの値にアクセスできない点が異なります。 詳細については、「定数」 を参照してください。
フィールドは required
宣言できます。 必須フィールドは、コンストラクターまたはオブジェクトの作成時に オブジェクト初期化子 によって初期化される必要があります。 必要なすべてのメンバーを初期化するコンストラクター宣言に、 System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute 属性を追加します。
required
修飾子を同じフィールドのreadonly
修飾子と組み合わせることはできません。 ただし、 プロパティ の required
と init
のみ可能です。
C# 12 以降では、 プライマリ コンストラクター パラメーターはフィールドを宣言する代わりに使用できます。 型に初期化時に指定する必要がある依存関係がある場合は、それらの依存関係を提供するプライマリ コンストラクターを作成できます。 これらのパラメーターは、型内の宣言されたフィールドの代わりにキャプチャして使用できます。
record
型の場合、プライマリ コンストラクター パラメーターはパブリック プロパティとして表示されます。
C# 言語仕様
詳細については、C# 言語仕様のを参照してください。 言語仕様は、C# の構文と使用法の決定的なソースです。
こちらも参照ください
.NET