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