參照型別的範例建構函式不能被繼承(不過,可以通過 base 關鍵字呼叫父類別的建構函式),它負責初始化型別的範例欄位。
對於靜態欄位,由靜態建構函式負責。當然,也可以在範例建構函式中為靜態成員賦值,但是,當之後更改這個值,再建立一個新的範例時,你會發現值又被範例建構函式改回去了。
所以,通常在靜態建構函式中為靜態成員賦值 (因為它只會執行一次)。
如果型別沒有定義任何建構函式,C# 會生成一個無參範例建構函式(.ctor),它遍歷類 型中所有的成員,並將它們設定為預設值。
可以宣告多個不同的建構函式。可以利用 this 關鍵字來呼叫其他建構函式。例如:
public class AClass
{
public int i;
public static int j;
static AClass()
{
j = 2;
Console.WriteLine("靜態建構函式");
}
public AClass() : this(5)
{
Console.WriteLine("範例建構函式");
}
public AClass(int i)
{
this.i = i;
Console.WriteLine("有引數的範例建構函式");
}
}
在這個例子中,我們使用下面的程式碼新建範例:
static void Main(string[] args)
{
var a = new AClass();
Console.WriteLine(a.i);
var b = new AClass(10);
Console.WriteLine(b.i);
Console.ReadKey();
}
根據規則,建立 a 時,呼叫無參的建構函式。但無參的建構函式呼叫了有參的建構函式,所以,先執行有參的建構函式,將 i 設定為 5,再執行無參的建構函式。
建立 b 則只呼叫有參的建構函式。最後的輸出結果如下圖所示。