標籤:單例 讀書筆記 空間 高效 變數 code 沒有 靜態成員 複雜
在建立某個類型執行個體之前,就應該初始化該執行個體的所有靜態成員變數。而C#為此提供了靜態初始化器和靜態建構函式。
靜態建構函式是特殊的建構函式,將在其他所有方法執行之前以及變數或屬性被第一次訪問之前執行。
若是簡單的為某個成員分配空間,可以使用初始化器文法來替代靜態建構函式。若是要以更複雜一些的邏輯初始化靜態成員變數,那麼可以使用靜態建構函式。
單例模式是靜態建構函式最常用的一個情境,只需將執行個體建構函式聲明為私人,然後添加初始化器即可:
public class MySingleton{ private static readonly MySingleton theOneAndOnly = new MySingleton(); private MySingleton(){} public static MySingleton TheOnly { get { return theOneAndOnly; } }}
如果你還有更複雜的初始化單例的邏輯,則可以使用靜態建構函式:
public class MySingleton{ private static readonly MySingleton theOneAndOnly; private MySingleton(){} static MySingleton() { theOneAndOnly = new MySingleton(); //other code... } public static MySingleton TheOnly { get { return theOneAndOnly; } }}
靜態建構函式相比靜態初始化器相比,其優點是可以捕獲異常,因為靜態建構函式和靜態初始化器出錯時,CLR將會終止你的程式,而可以捕獲異常的靜態建構函式就可以使程式繼續運行,但其缺點也在此,靜態建構函式只能初始化一次,若出現錯誤造成某個類型沒有初始化,那麼CLR將不會再次進行初始化嘗試。
《C#高效編程》讀書筆記13-正確的初始化靜態成員變數