本文轉自:http://www.chenjiliang.com/article/View.aspx?ArticleID=1810&TypeID=34
我們知道應當在建立類型的所有執行個體之前首先初始化靜態成員變數。C#讓我們使用靜態初始化和靜態建構函式來達到這個目的。靜態建構函式是一種特殊的函數,它會在類中的所有的方法、成員變數或者屬性定義之前運行。我們使用這個方法在類中來聲明靜態變數,構造singleton設計模式或者其他需要的工作。我們不應當使用預設的建構函式,一些特殊的私人函數或者其他的聲明靜態變數的方法。
就像執行個體的初始化一樣,我們可以使用靜態建構函式來聲明靜態成員變數。如果僅僅是需要簡單的靜態成員變數,我們可以使用初始化的方法。如果我們需要使用較為複雜的邏輯時,我們就需要使用靜態成員變數的建構函式來建立它們。
在C#的涉及模式中,Singleton模式是我們經常要用到的。我們只要將類的執行個體化建構函式設為private,再添加對靜態成員的初始化: 儲存
public class MySingleton{private static readonly MySingleton _theOneAndOnly = new MySingleton();public static MySingleton TheOnly{get{return _theOneAndOnly;}}private MySingleton(){}}
Singleton模式可以被簡單的使用下面的方法來達到。 儲存
public class MySingleton{private static readonly MySingleton _theOneAndOnly;static MySingleton(){_theOneAndOnly = new MySingleton();}public static MySingleton TheOnly{get{return _theOneAndOnly;}}private MySingleton(){}}
就像執行個體的初始化一樣,靜態成員變數的初始化會在靜態建構函式被調用之前執行。
當我們的應用程式第一次裝載我們的類型時,CLR會調用我們的靜態建構函式。我們只能定義一個靜態建構函式,並且它不能擁有參數。因為靜態建構函式是被CLR調用的,因此我們必須小心它可能會引起異常。一旦其中包含異常,CLR就會中止我們的程式。我們不直接對靜態變數進行初始化而是使用靜態建構函式的原因也在於此。通過靜態建構函式,我們可以比較容易得捕獲這些異常。 儲存
static MySingleton(){try{_theOneAndOnly = new MySingleton();}catch{//捕獲異常 }}
靜態初始化和靜態建構函式提供了更清潔和更簡便的方法來聲明我們類型中的靜態成員。它們更容易被人理解,也更容易進行調試。
譯自 Effective C#:50 Specific Ways to Improve Your C# Bill Wagner著