欄位 (C# 程式設計手冊)

「欄位」是任意類型的變數,可在類別結構中直接宣告。 欄位是其包含類型的「成員」

類別或結構可能有執行個體欄位、靜態欄位,或同時有兩者。 執行個體欄位是專屬於某種類型的執行個體。 如果您有類別 T (包含執行個體欄位 F),您可以建立兩個類型 T 的物件,然後修改每個物件中 F 的值,而不影響另一個物件中的值。 至於靜態欄位即屬類型本身,並共用於該類型所有的執行個體間。 您只能使用類型名稱存取靜態欄位。 如果您以執行個體名稱存取靜態欄位,您會看到 CS0176 編譯時期錯誤。

一般而言,您應該為欄位宣告 privateprotected 存取性。 類型公開給用戶端程式碼的資料,最好透過方法屬性索引子提供。 藉由使用這些建構來間接存取內部欄位,即可防範無效的輸入值。 儲存由公用屬性公開之資料的私用欄位稱為「備份存放區」或「支援欄位」。 您可以宣告 public 欄位,但無法阻止使用您類型的程式碼將該欄位設定為無效值或以改為變更物件的資料。

欄位通常儲存的資料必須是多個類型方法可存取的資料,且必須比任何單一方法的存留期儲存得更久。 例如,表示行事曆日期的類型可能有三個整數欄位,分別是月、日、年。 不用於單一方法範圍外的變數,最好在方法主體本身中宣告為區域變數

請依序指定欄位的存取層級、類型、名稱,然後在類別或結構區塊中宣告欄位。 例如:

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 internalprivate protected。 這些存取修飾詞定義類型使用者可如何存取欄位。 如需詳細資訊,請參閱存取修飾詞

欄位可以選擇性地宣告為 static。 即使沒有類型執行個體,呼叫者仍可隨時使用靜態欄位。 如需詳細資訊,請參閱靜態類別和靜態類別成員

欄位可以宣告為 readonly。 您只能在初始化期間或在建構函式中指派值給唯讀欄位。 static readonly 欄位類似於常數,但 C# 編譯器只能在執行階段存取,而無法在編譯時間存取靜態唯讀欄位的值。 如需詳細資訊,請參閱常數

欄位可以宣告為 required。 建立物件時,您必須使用建構函式或物件初始設定式初始化必要欄位。 您可以新增 System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute 屬性至任何初始化必要成員的建構函式宣告。

required 修飾詞無法與同個欄位上的 readonly 修飾詞合併。 不過,屬性只可以是 requiredinit

從 C# 12 開始,主要建構函式參數是宣告欄位的替代方案。 當您的類型具有必須在初始化時提供的相依性時,您可以建立提供這些相依性的主要建構函式。 您可以擷取這些參數,並用來取代類型中宣告的欄位。 在 record 類型的情況下,主要建構函式參數會呈現為公用屬性。

C# 語言規格

如需詳細資訊,請參閱<C# 語言規格>。 語言規格是 C# 語法及用法的限定來源。

另請參閱