類別常有多個建構函式,維護所有建構函式中欄位初始化同步極易出錯。欄位初始化運算式(宣告時直接賦值)讓編譯器自動在所有建構函式前插入初始化碼,新增建構函式或欄位皆自動受惠,最簡單可靠。
public class MyClass
{
private ArrayList _coll = new ArrayList(); // 所有建構函式前自動執行
public MyClass() { }
public MyClass(int size) { _coll = new ArrayList(size); } // 覆寫預設值
}
CLR 已在配置記憶體時將所有位元置零。額外寫 _field = null 或 _val = new ValType() 產生多餘 IL:
ldnull; stfld 指令。initobj 指令,觸發裝箱/拆箱(參見原則 17),效能損失更大。private ArrayList _coll = new ArrayList(); // 預設配置
public MyClass(int size) { _coll = new ArrayList(size); } // 第二次配置,第一個成垃圾
解決:改用建構函式鏈結(原則 14),僅在最終建構函式配置。
欄位初始化運算式拋出的例外會直接冒泡至型別建構器外部,無法在類別內捕獲。需異常處理時,請移至建構函式(參見原則 45)。