欄位又稱成員變數,表示儲存位置,是 C# 類別不可或缺部分。型別可為任何 C# 資料型別(除 string 外其他參考型別涉及建構函式操作,放在「介面繼承多型」講解)。
MyObject.instanceField。MyClass.staticField。不可透過物件存取(MyObject.staticField 編譯錯誤),此點與傳統 C++ 不同。五種存取修飾詞均適用欄位。internal 擴展 C++ friend,需相互可見欄位時宣告為 internal 並置於同一組件編譯。需對繼承子類別也可見則宣告 protected internal。
| 特性 | readonly | const |
|---|---|---|
| 賦值時機 | 宣告初始化或建構函式初始化 | 宣告時必須賦值 |
| 值確定時期 | 執行時 | 編譯時 |
| 可為實例/靜態 | 是 | 僅靜態(隱含 static) |
| 型別限制 | 任意型別 | 簡單型別、string、enum、null 參考型別 |
關鍵差異:const 編譯時計算確定值並代換到每個引用處;readonly 執行時確定,僅初始化後不希望改變。跨組件參考時,修改 const 值需重新編譯所有引用組件;修改 readonly 僅需重編譯定義組件。大型系統開發特別需注意。
編譯器預設將每個欄位初始化為預設值(數值 0、字元 \x0000、布林 false、參考 null、結構遞迴預設值)。但面向物件設計原則仍建議正確初始化,未初始化會產生編譯警告。初始化兩處:宣告時、建構函式內。宣告初始化被編譯器作為賦值陳述式置於建構函式最開始。實例變數置於實例建構函式,靜態變數置於靜態建構函式。宣告靜態變數並初始化時,編譯器自動產生靜態建構函式。const 嚴格說非初始化陳述式,類似 C++ 宏代換。