C#箴言:用靜態(tài)構(gòu)造函數(shù)初始化靜態(tài)成員

字號:

編寫程序的時候難免要使用到靜態(tài)成員,由于靜態(tài)成員的訪問是脫離類型對象的,所以使用非靜態(tài)構(gòu)造函數(shù),私有方法或者一些其他方法都是不合理的。.net提供了成員初始化語句和靜態(tài)構(gòu)造函數(shù)來初始化靜態(tài)成員。
    根據(jù)上一個單元,我們可以知道靜態(tài)成員的初始化語句會早于靜態(tài)構(gòu)造函數(shù)執(zhí)行,其次還知道成員初始化語句的好處和一些限制。這里要提的一點就是,靜態(tài)構(gòu)造函數(shù)和實例構(gòu)造函數(shù)之間的區(qū)別,因為靜態(tài)構(gòu)造函數(shù)是由CLR調(diào)用執(zhí)行的,所以靜態(tài)構(gòu)造函數(shù)只能是一個,同時不能還有參數(shù)。那么靜態(tài)構(gòu)造函數(shù)相對于成員初始化的一些弊端都不復存在。
    此外,對于成員初始化的問題,就是異常無法捕獲,可能對于普通成員來說,還可以在構(gòu)造類型對象的時候加上try-catch;而對于靜態(tài)成員來說,有時無法確定哪一個類型訪問語句會先執(zhí)行,如果對每個使用類型的地方都加上try-catch,會降低程序可讀性。但如果把這種異常散發(fā)出去,會導致整個程序崩潰。那么使用靜態(tài)構(gòu)造函數(shù)就能比較好的捕獲異常,并進行異常處理。
    對于靜態(tài)成員初始化語句和靜態(tài)構(gòu)造函數(shù)一個對比大致如下。
     簡便性 安全性 異常處理
    靜態(tài)成員初始化 最簡便 比較安全 非常難
    靜態(tài)構(gòu)造函數(shù) 比較簡便 最安全 容易
    那么到底用什么方法來初始化靜態(tài)成員呢,給出以下兩點建議:
    第一就是簡單靜態(tài)成員,例如類型為值類型等,使用成員初始化語句來完成;
    第二靜態(tài)成員初始化比較復雜,或者有可能出現(xiàn)異常,那么用靜態(tài)構(gòu)造函數(shù)來完成。
    本單元的內(nèi)容基本上講完了,現(xiàn)在說說靜態(tài)成員最主要的一個應(yīng)用“Singleton”,就是保證此類型的對象性。其實實現(xiàn)很簡單,如下就舉一個簡單的例子。
    public class MySingleton
    {
    private static readonly MySingleton _theOneAndOnly;
    static MySingleton()
    {
    _theOneAndOnly = new MySingleton();
    }
    public static MySingleton TheOnly
    {
    get{ return _theOneAndOnly; }
    }
    ///
    /// Private constructor to avoid object created from outside
    ///

    private MySingleton()
    {}
    }