C# 依據宣告位置與修飾詞,將變數劃分為七大類別。理解各類別的生命週期、作用域與初始化語意,是撰寫正確、高效程式碼的關鍵。
| 類別 | 關鍵字/位置 | 生命週期 | 預設初始化 | 指派檢查 |
|---|---|---|---|---|
| 靜態變數 | static 修飾 | 類別載入 ~ 程式結束 | 型別預設值 | 編譯期檢查 |
| 非靜態變數(實例欄位) | 類別內、無 static | 實例建立 ~ GC 回收 | 型別預設值 | 建構函式檢查 |
| 陣列元素 | 陣列建立時 | 陣列實例存活期間 | 型別預設值 | 建立時檢查 |
| 值參數 | 方法參數、無修飾 | 方法呼叫 ~ 返回 | 呼叫端必須指派 | 呼叫端檢查 |
| 參考參數 | ref 修飾 | 同上 | 呼叫端必須已指派 | 呼叫端檢查 |
| 輸出參數 | out 修飾 | 同上 | 方法內必須指派 | 方法內檢查 |
| 區域變數 | 區塊/迴圈/using 內 | 進入區塊 ~ 離開區塊 | 無自動初始化 | 使用前必須指派 |
AppDomain 存活期間僅有一份拷貝。建議宣告時直接指派 static int Count = 0;。new 出的物件各自擁有獨立拷貝。結構體的實例欄位隨結構體變數生存期同步。int x; Console.WriteLine(x); → 編譯錯誤 CS0165。for (int i = 0; i < 10; i++) {
int num = a; // 錯誤:a 尚未宣告
int a = 5;
int b = a; // 正確
}
ref:雙向傳遞,呼叫端變數必須已初始化。out:單向輸出,方法內必須指派值才能返回。params:可變參數陣列,內部視為陣列元素變數。class A {
public static int x; // 靜態變數
int y; // 非靜態變數
void F(int[] v, int a, ref int b, out int c) {
int i = 1; // 區域變數
c = a + b++; // out 參數必須指派
}
}
掌握這七類變數的語意差異,能有效避免「未指派變數」、「意外共享狀態」、「結構體複製語意誤解」等常見缺陷。