使用建構函式 (C# 程式設計手冊)

具現化類別結構時,會呼叫其建構函式。 建構函式的名稱與類別或結構相同,而且通常會初始化新物件的資料成員。

在下列範例中,使用一個簡單的建構函式定義名為 Taxi 的類別。 然後使用 new 運算子具現化此類別。 為新物件配置記憶體之後,new 運算子會立即叫用 Taxi 建構函式。

public class Taxi
{
    public bool IsInitialized;

    public Taxi()
    {
        IsInitialized = true;
    }
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi();
        Console.WriteLine(t.IsInitialized);
    }
}

不接受任何參數的建構函式稱為「無參數建構函式」。 每當使用 new 運算子來具現化物件,而且未提供引數給 new 時,便會叫用無參數建構函式。 C# 12 引進 主要建構函式。 主要建構函式會指定必須提供以初始化新對象的參數。 如需詳細資訊,請參閱執行個體建構函式

除非類別是靜態,否則沒有建構函式的類別會從 C# 編譯器取得一個公開無參數建構函式,以啟用類別具現化。 如需詳細資訊,請參閱靜態類別和靜態類別成員

您可以將建構函式設為私用,避免具現化類別,如下所示:

class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = Math.E;  //2.71828...
}

如需詳細資訊,請參閱 私用建構函式

結構類型的建構函式類似於類別建構函式。 使用 具現化 new結構類型時,會叫用建構函式。 struct當 設定為其default值時,運行時間會將 結構中的所有記憶體初始化為 0。 在 C# 10 之前,無法包含明確的無參數建構函式, structs 因為編譯程式會自動提供一個建構函式。 如需詳細資訊,請參閱結構型別一文中的結構初始化和預設值一節。

下列程式代碼使用 的 Int32無參數建構函式,因此您確信整數已初始化:

int i = new int();
Console.WriteLine(i);

不過,下列程式代碼會造成編譯程式錯誤,因為它不使用 new,而且因為它嘗試使用尚未初始化的物件:

int i;
Console.WriteLine(i);

或者,您可以初始化或指派以 structs 為基礎的物件 (包括所有內建數字類型),再如下列範例所示使用這些物件:

int a = 44;  // Initialize the value type...
int b;
b = 33;      // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);

類別和結構都可以定義採用參數的建構函式,包括 主要建構函式。 使用參數的建構函式必須透過 new 陳述式或 base 陳述式呼叫。 類別和結構也可以定義多個建構函式,而且不需要定義無參數建構函式。 例如:

public class Employee
{
    public int Salary;

    public Employee() { }

    public Employee(int annualSalary)
    {
        Salary = annualSalary;
    }

    public Employee(int weeklySalary, int numberOfWeeks)
    {
        Salary = weeklySalary * numberOfWeeks;
    }
}

使用下列任一陳述式即可建立此類別:

Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);

建構函式可以使用 base 關鍵字呼叫基底類別的建構函式。 例如:

public class Manager : Employee
{
    public Manager(int annualSalary)
        : base(annualSalary)
    {
        //Add further instructions here.
    }
}

在此範例中,執行建構函式的區塊之前,會先呼叫基底類別的建構函式。 不論是否有參數,都可以使用 base 關鍵字。 建構函式的任何參數都可以作為 base 的參數使用,或作為運算式的一部分使用。 如需詳細資訊,請參閱 base

在衍生類別中,如果未使用 base 關鍵詞明確呼叫基類建構函式,則會隱含呼叫無參數建構函式。 下列建構函式宣告實際上相同:

public Manager(int initialData)
{
    //Add further instructions here.
}
public Manager(int initialData)
    : base()
{
    //Add further instructions here.
}

如果基類不提供無參數建構函式,衍生類別必須使用 明確呼叫基底建構函 base式。

建構函式可以使用 this 關鍵字來叫用相同物件中的另一個建構函式。 如同 base,不論是否有參數,都可以使用 this,而且建構函式中的任何參數都可以作為 this 的參數使用,或作為運算式的一部分使用。 例如,上述範例中的第二個建構函式可使用 this 重寫成:

public Employee(int weeklySalary, int numberOfWeeks)
    : this(weeklySalary * numberOfWeeks)
{
}

在上述範例中使用 this 會呼叫下列建構函式:

public Employee(int annualSalary)
{
    Salary = annualSalary;
}

建構函式可以標記為 publicprivateprotectedinternalprotected internalprivate protected。 這些存取修飾詞定義類別使用者如何建構類別。 如需詳細資訊,請參閱存取修飾詞

建構函式可使用 static 關鍵字宣告為靜態。 靜態建構函式會在存取任何靜態欄位之前立即自動呼叫,並用來初始化靜態類別成員。 如需詳細資訊,請參閱靜態建構函式

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格執行個體建構函式靜態建構函式。 語言規格是 C# 語法及用法的限定來源。

另請參閱