靜态構造函數
一:特點
1:靜态構造函數既沒有通路修飾符,也沒有參數。
2:如果沒有編寫靜态構造函數,而這時類中包含帶有初始值設定的靜态字段,那麼編譯器會自動生成預設的靜态構造函數。
3:在建立第一個類執行個體或任何靜态成員被引用時,.NET将自動調用靜态構造函數來初始化類,也就是說我們無法直接調用靜态構造函數,也就無法控制什麼時候執行靜态構造函數了。
4:如果類中包含用來開始執行的 Main 方法,則該類的靜态構造函數将在調用 Main 方法之前執行。
5:如果類中的靜态字段帶有初始化,則靜态字段的初始化語句将在靜态構造函數之前運作。
6:一個類隻能有一個靜态構造函數。
7:無參數的構造函數可以與靜态構造函數共存。盡管參數清單相同,但一個屬于類,一個屬于執行個體,是以不會沖突。
8:最多隻運作一次。
9:靜态構造函數不可以被繼承。
二 :需求
1.為什麼使用靜态構造函數?
類有一些靜态字段和屬性,需要在第一次使用類之前,從外部源中初始化這些靜态字段和屬性
2.靜态構造函數什麼時候執行
CLR不能确定靜态構造函數什麼時候執行,也不能預計不同類的靜态構造函數按什麼順序執行,但可以明确的是,靜态構造函數之多執行一次,即在引用類之前執行在C#中,靜态構造函數通常在第一次調用類的成員之前執行
3.靜态構造函數有通路修飾符嗎?
沒有。因為,C#代碼從不調用它,但在加載類時,總是由,CLR調用它。對于C#來說是私有的吧
4.靜态構造函數可以有參數嗎?
不能有參數。
5.一個類可以有多個靜态構造函數嗎?
一個類隻能有一個靜态構造函數
6.靜态構造函數可以通路執行個體成員嗎?
顯然不能。隻能通路靜态成員
7.一個類可以同時擁有午餐的靜态構造函數和執行個體構造函數嗎?
可以。因為,靜态構造函數是在加載類時執行的,而執行個體構造函數是在建立執行個體時執行的,是以兩者不會有沖突
三:示例
class A
{
public static int X;
static A() //④ 執行完後傳回到③
{
X = B.Y + 1;
Console.WriteLine("static A()");
}
}
class B
{
public static int Y = A.X + 1; //③ 調用了A的靜态成員,
// 轉到A的靜态構造函數---->
static B() //② 如果帶有初始值設定項的靜态字段,
// 執行該類的靜态構造函數時,
// 先要按照文本順序執行那些初始值設定項。
// 轉到初始值設定項---->
{
Console.WriteLine("static B()");
}
static void Main() //① 程式入口,
// 如果類中包含用來開始執行的 Main 方法,
// 該類的靜态構造函數将在調用 Main 方法之前執行。
// 轉到B的靜态構造函數---->
{
Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);//⑤ 輸出結果
Console.ReadLine();
}
}
執行結果:X=1;Y=2