欄位 (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# 程式設計手冊)。
![]() |
---|
欄位初始設定式無法參考其他執行個體欄位。 |
欄位可以標記為 public、private、protected、internal 或 protected internal。這些存取修飾詞將定義類別使用者如何存取欄位。如需詳細資訊,請參閱存取修飾詞 (C# 程式設計手冊)。
欄位也可以選擇性地宣告為 static。這讓呼叫端即使沒有類別的執行個體,也可以隨時使用該欄位。如需詳細資訊,請參閱靜態類別和靜態類別成員 (C# 程式設計手冊)。
欄位可以宣告為 readonly。若為唯讀欄位,就只能在初始化期間或在建構函式中指派值給該欄位。staticreadonly 欄位非常類似於常數,唯一不同的是,C# 編譯器無法在編譯時期存取靜態唯讀欄位的值,只有在執行階段才能這麼做。如需詳細資訊,請參閱常數 (C# 程式設計手冊)。
C# 語言規格
如需詳細資料,請參閱 C# 語言規格中的下列章節:
1.6.5 欄位
10.5 欄位