今天花了一些時間把靜態構造函數的用法總結了一下,希望高手們指點。謝謝!
靜態構造函數既沒有訪問修飾符,也沒有參數。
如果沒有編寫靜態構造函數,而這時類中包含帶有初始值設定的靜態字段,那麼編譯器會自動生成默認的靜態構造函數。
在創建第一個類實例或任何靜態成員被引用時,.NET將自動調用靜態構造函數來初始化類,也就是說我們無法直接調用靜態構造函數,也就無法控制什麼時候執行靜態構造函數了。
如果類中包含用來開始執行的 Main 方法,則該類的靜態構造函數將在調用 Main 方法之前執行。
如果類中的靜態字段帶有初始化,則靜態字段的初始化語句將在靜態構造函數之前運行。
一個類只能有一個靜態構造函數。
無參數的構造函數可以與靜態構造函數共存。盡管參數列表相同,但一個屬於類,一個屬於實例,所以不會沖突。
最多只運行一次。
靜態構造函數不可以被繼承。
示例代碼如下: namespace Test
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
{
class Program
{
public static int X;
//步驟2,因為在步驟1中調用了 Program.X,而在創建第一個實例或引用任何靜態成員之前,將自動調用靜態構造函數來初始化類。
static Program()
{
X = B.Y + 1; //此時B.Y=0;
Console.WriteLine("static A()");
}
}
class B
{
/*步驟1
如果類中包含用來開始執行的 Main 方法,則該類的靜態構造函數將在調用 Main 方法之前執行。
如果類中的靜態字段帶有初始化,則靜態字段的初始化語句將在靜態構造函數之前運行。*/
public static int Y = Program.X + 1;
static B()
{
Console.WriteLine("static B()");
}
static void Main()
{
Console.WriteLine("X = {0}, Y = {1}", Program.X, B.Y);
Console.ReadLine();
}
}
}
運行的結果是:
static A()
static B()
X=1,Y=2