欄位是任何類型變數,直接在類別或結構中宣告。 欄位是其包含類型 的成員 。
類別或結構可能會有實例欄位、靜態欄位或兩者。 實例欄位是類型實例特有的。 如果您有類別 T
,且具有實例字段 F
,您可以建立兩個 型 T
別 的物件,並修改每個物件中的 值 F
,而不會影響其他物件中的值。 相反地,靜態欄位屬於類型本身,而且會在該類型的所有實例之間共用。 您只能使用類型名稱來存取靜態欄位。 如果您以實例名稱存取靜態字段,則會收到 CS0176 編譯時間錯誤。
一般而言,您應該宣告 private
或 protected
可存取欄位。 您的類型公開給用戶端程式代碼的數據應該透過 方法、 屬性和 索引器來提供。 藉由使用這些建構來間接存取內部欄位,您可以防範無效的輸入值。 儲存公用屬性所公開數據的私用字段稱為 備份儲存區 或 備份欄位。 您可以宣告 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";
//...
}
在呼叫物件實例的建構函式之前,會立即初始化欄位。 如果建構函式指派欄位的值,則會覆寫欄位宣告期間提供的任何值。 如需詳細資訊,請參閱 使用建構函式。
備註
欄位初始化表達式無法參考其他實例欄位。
欄位可以標示為 public
、、private
、protected
internal
、protected internal
、 或 private protected
。 這些存取修飾詞會定義型別的使用者如何存取欄位。 如需詳細資訊,請參閱 存取修飾子。
您可以選擇性地宣告 static
欄位。 靜態欄位隨時可供呼叫端使用,即使類型實例不存在也一樣。 如需詳細資訊,請參閱靜態類別和靜態類別成員。
欄位可以被宣告為readonly
。 只讀欄位只能在初始化期間或在建構函式中指派值。
static readonly
欄位與常數類似,不同之處在於 C# 編譯程式在編譯時期無法存取靜態只讀欄位的值,只能在運行時間存取。 如需詳細資訊,請參閱 常數。
欄位可以被宣告為required
。 必要欄位必須由建構函式或 物件初始化運算式 在建立物件時初始化。 您可以將屬性 System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute 新增至任何初始化所有必要成員的建構函式的宣告。
required
修飾詞不能與readonly
相同欄位上的修飾詞結合。 不過, 屬性 只能是 required
和 init
。
從 C# 12 開始, 主要建構函 式參數是宣告欄位的替代方案。 當您的類型具有必須在初始化時提供的相依性時,您可以建立提供這些相依性的主要建構函式。 您可以擷取這些參數,並用來取代類型中宣告的欄位。 對於record
類型,主建構函式參數會呈現為公用屬性。
C# 語言規格
如需詳細資訊,請參閱<C# 語言規格>。 語言規格是 C# 語法和使用方式的最終來源。