共用方式為


使用建構函式 (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# 語法及用法的限定來源。

另請參閱