共用方式為


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

更新:2007 年 11 月

「欄位」(Field) 是一個任意型別的變數,直接在類別建構中宣告。欄位是其包含型別 (Containing Type) 的「成員」(Member)。

類別 (Class) 或結構 (Struct) 可能會有執行個體 (Instance) 欄位或靜態 (Static) 欄位,或者兩個都有。執行個體欄位專屬於某個型別的執行個體。如果您有類別 T 搭配執行個體欄位 F,則您可以建立兩個型別 T 的物件,然後修改每個物件中 F 的值,而不會影響到另一個物件中的值。相較之下,靜態欄位屬於類別本身所有,在該類別的所有執行個體之間共用。對執行個體 A 所做的變更,執行個體 B 和 C 只要存取該欄位就會馬上看到。

一般來說,欄位只應用在具有 private 或 protected 存取範圍的變數上。類別公開 (Expose) 給用戶端程式碼的資料應透過方法屬性索引子來提供。透過以這些建構來間接存取內部欄位,您可以防範無效的輸入值。儲存由公用屬性公開之資料的私用欄位稱為「支援存放區」(Backing Store) 或「支援欄位」(Backing Field)。

欄位通常用來儲存必須由一個以上類別方法存取的資料,以及其儲存時間比任何單一方法的存留期 (Lifetime) 都還要長的資料。例如,表示行事曆日期的類別有三個整數欄位,分別為月、日和年。不會在單一方法以外範圍使用的變數,應在方法主體當中宣告為「區域變數」(Local Variable)。

您必須依序指定欄位的存取層級、欄位型別和欄位名稱,以在類別區塊中宣告欄位。例如:

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";
    //...
}

在物件執行個體 (Instance) 的建構函式 (Constructor) 即將進行呼叫之前,欄位就會進行初始化。當建構函式指派欄位的值時,它就會覆寫在欄位宣告期間所指定的任何值。如需詳細資訊,請參閱使用建構函式 (C# 程式設計手冊)

注意事項:

欄位初始設定式無法參考其他執行個體欄位。

欄位可以標記為 publicprivateprotectedinternal 或 protected internal。這些存取修飾詞將定義類別使用者如何存取欄位。如需詳細資訊,請參閱存取修飾詞 (C# 程式設計手冊)

欄位也可以選擇性地宣告為 static。這讓呼叫端即使沒有類別的執行個體,也可以隨時使用該欄位。如需詳細資訊,請參閱靜態類別和靜態類別成員 (C# 程式設計手冊)

欄位可以宣告為 readonly。若為唯讀欄位,就只能在初始化期間或在建構函式中指派值給該欄位。staticreadonly 欄位非常類似於常數,唯一不同的是,C# 編譯器無法在編譯時期存取靜態唯讀欄位的值,只有在執行階段才能這麼做。如需詳細資訊,請參閱常數 (C# 程式設計手冊)

C# 語言規格

如需詳細資料,請參閱 C# 語言規格中的下列章節:

  • 1.6.5 欄位

  • 10.5 欄位

請參閱

概念

C# 程式設計手冊

參考

類別和結構 (C# 程式設計手冊)

使用建構函式 (C# 程式設計手冊)

繼承 (C# 程式設計手冊)

存取修飾詞 (C# 程式設計手冊)

抽象和密封類別以及類別成員 (C# 程式設計手冊)