次の方法で共有


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

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

クラスまたは構造体には、インスタンス フィールド、静的フィールド、またはその両方が含まれる場合があります。 インスタンス フィールドは、型のインスタンスに固有です。 インスタンス フィールドが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";
    //...
}

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

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

フィールドは、 publicprivateprotectedinternalprotected internal、または private protectedとしてマークできます。 これらのアクセス修飾子は、型のユーザーがフィールドにアクセスする方法を定義します。 詳細については、「 アクセス修飾子」を参照してください。

必要に応じて、フィールドを static宣言できます。 静的フィールドは、型のインスタンスが存在しない場合でも、呼び出し元がいつでもアクセスできます。 詳細については、「 静的クラスと静的クラス メンバー」を参照してください。

フィールドは readonly宣言できます。 読み取り専用フィールドには、初期化中またはコンストラクター内でのみ値を割り当てることができます。 static readonly フィールドは定数に似ていますが、C# コンパイラはコンパイル時にのみ、実行時にのみ静的読み取り専用フィールドの値にアクセスできない点が異なります。 詳細については、「定数」 参照してください。

フィールドは required宣言できます。 必須フィールドは、コンストラクターまたはオブジェクトの作成時に オブジェクト初期化子 によって初期化される必要があります。 必要なすべてのメンバーを初期化するコンストラクター宣言に、 System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute 属性を追加します。

required修飾子を同じフィールドのreadonly修飾子と組み合わせることはできません。 ただし、 プロパティrequiredinit のみ可能です。

C# 12 以降では、 プライマリ コンストラクター パラメーターはフィールドを宣言する代わりに使用できます。 型に初期化時に指定する必要がある依存関係がある場合は、それらの依存関係を提供するプライマリ コンストラクターを作成できます。 これらのパラメーターは、型内の宣言されたフィールドの代わりにキャプチャして使用できます。 record型の場合、プライマリ コンストラクター パラメーターはパブリック プロパティとして表示されます。

C# 言語仕様

詳細については、C# 言語仕様のを参照してください。 言語仕様は、C# の構文と使用法の決定的なソースです。

こちらも参照ください