(譯注:initializer在上文中譯為了“初始化器”,實在不好聽 ,本文中全部改譯為:“預置方法”)
你應該知道,在一個類 型的任何實例初始化以前,你應該初始化它的靜態成員變量。在裡C#你可以使用 靜態的預置方法和靜態構造函數來實現這個目的。一個類的靜態構造函數是一個 與眾不同的,它在所有的方法,變量或者屬性訪問前被執行。你可以用這個函數 來初始化靜態成員變量,強制使用單件模式,或者實現其它任何在類型的實例可 用前應該完成的工作。你不能用任何的實例構造函數,其它特殊的私有函數, 或者任何其它習慣方法來初始化一個 變量(譯注:編譯器就不讓你這樣做,所以 你不用擔心這樣的問題)。
和實例的預置方法一樣,你可以把靜態的預置 方法做為靜態構造函數可替代的選擇。如果須要簡單的分配一個靜態成員,就直 接使用初始化語法。當你有更復雜的邏輯來初始化靜態成員變量時,就創建一個 靜態構造函數:
public class MySingleton
{
private static readonly MySingleton _theOneAndOnly =
new MySingleton( );
public static MySingleton TheOnly
{
get
{
return _theOneAndOnly;
}
}
private MySingleton( )
{
}
// remainder elided
}
可以用下面的方法簡單的實現單件模 式,實際上你在初始化一個單件模式時可能有更復雜的邏輯:
public class MySingleton
{
private static readonly MySingleton _theOneAndOnly;
static MySingleton( )
{
_theOneAndOnly = new MySingleton( );
}
public static MySingleton TheOnly
{
get
{
return _theOneAndOnly;
}
}
private MySingleton( )
{
}
// remainder elided
}
同樣,和實例的預置方法一樣,靜態的預置方法在靜態的構造函 數調用前執行。並且,你的靜態預置方法在基類的靜態構造函數執行前被執行。
當應用程序第一次裝載你的數據類型時,CLR自動調用靜態構造函數。你 只能定義一個靜態構造函數,並且不能有參數。因為靜態構造函數是CLR調用的 ,你必須十分注意異常的產生。如果在靜態構造函數裡產生了異常,CLR將會直 接終止你的應用程序。正因為異常,靜態構造函數常常代替靜態預置方法。如果 你使用靜態預置方法,你自己不能捕獲異常。做為一個靜態的構造,你可以這樣 (參見原則45):
static MySingleton( )
{
try {
_theOneAndOnly = new MySingleton( );
} catch
{
// Attempt recovery here.
}
}
靜態 預置方法和靜態構造函數為你的類提供了最清爽的方法來初始化靜態成員。與其 它語言不同,它們被添加到C#語言中,是初始化靜態成員的兩個不同的特殊位置 。
返回教程目錄