C#建構函式

2020-07-16 10:04:46
參照型別的範例建構函式不能被繼承(不過,可以通過 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 則只呼叫有參的建構函式。最後的輸出結果如下圖所示。