欄位 (C# 程式設計手冊)
更新:2010 年 8 月
「欄位」(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
{
// Set some reasonable boundaries for likely birth dates.
if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
{
date = value;
}
else
throw new ArgumentOutOfRangeException();
}
}
// 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();
}
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。 若為唯讀欄位,就只能在初始化期間或在建構函式中指派值給該欄位。 static readonly 欄位非常類似於常數,唯一不同的是,C# 編譯器無法在編譯時期存取靜態唯讀欄位的值,只有在執行階段才能這麼做。 如需詳細資訊,請參閱常數 (C# 程式設計手冊)。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格。 語言規格是 C# 語法和用法的決定性來源。
請參閱
參考
概念
變更記錄
日期 |
記錄 |
原因 |
---|---|---|
2010 年 8 月 |
已更正範例中 if 陳述式的條件。 |
客戶回函。 |