欄位宣告標準語法
[attributes] [field-modifiers] 型別 變數宣告列表;
欄位修飾詞詳細說明
| 修飾詞 | 說明 | 備註 |
| new | 遮蔽基類別同名欄位 | 消除編譯器警告 CS0108 |
| public | 公開存取 | 不建議直接公開欄位,改用屬性 |
| protected | 衍生類別可存取 | 基類別實作細節暴露給衍生類別 |
| internal | 同一組件內可存取 | 組件內部實作共享 |
| private | 僅類別內部可存取 | 預設值,封裝最佳實務 |
| static | 屬於類別,共享單一儲存 | 不可與 readonly 衝突 (可共存) |
| readonly | 只能在宣告/建構子賦值 | 不可變資料、版本控制友善 |
| volatile | 指示編譯器/JIT 不優化存取順序 | 多執行緒共享欄位,配合 memory barrier |
| const | 編譯期常數 | 隱含 static,需宣告時初始化 |
多變數宣告與初始化
public int X, Y, Z; // 同型別多欄位
public int Width = 100, Height = 200; // 同型別多欄位帶初始化
// 不同型別需分開宣告
public string Name;
public int Age;
欄位 vs 區域變數關鍵差異
| 特性 | 欄位 | 區域變數 |
| 宣告位置 | 類別/結構體區塊內 | 方法/建構子/屬性/索引子/區塊內 |
| 預設值 | 自動指派型別預設值 | 無預設值,使用前必須指派 |
| 生命週期 | 實例/類別存活期間 | 方法/區塊執行期間 |
| 修飾詞 | 支援存取修飾詞、static、readonly 等 | 無修飾詞 (C# 7.0+ 可用 ref/out/in) |
| 可作為 ref/out 參數 | 是 | 是 |
常見模式與反模式
✅ 推薦模式
private readonly 欄位 + 公開屬性暴露 (封裝)。
static readonly 單例實例或共享不可變資料。
volatile 修飾多執行緒共享的布林旗標/計數器 (簡單情況)。
❌ 反模式
public 欄位直接暴露 → 破壞封裝、無法加驗證、序列化/繫結問題。
- 大量
static 可變欄位 → 全域狀態難以測試、執行緒安全風險。
- 在結構體中使用非
readonly 可變欄位 → 防禦性複製效能損失。
編譯器自動生成的預設建構子行為
若類別未定義任何建構子,編譯器會產生無參數建構子,僅執行欄位預設值初始化 (實際上 CLI 規範保證記憶體歸零,C# 編譯器不額外產生 IL 指令)。