共用方式為


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

更新:2007 年 11 月

建構函式 (Constructor) 是類別方法,會在指定型別的物件建立時執行。建構函式的名稱與類別名稱相同,通常用來初始化新物件的資料成員。

下列範例將使用簡單的建構函式來定義名為 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# 程式設計手冊)

除非是靜態類別,否則只要是沒有建構函式的類別,C# 編譯器都會指定公用 (Public) 預設建構函式,以執行類別執行個體化。如需詳細資訊,請參閱靜態類別和靜態類別成員 (C# 程式設計手冊)

您可以將建構函式設為私用 (Private),避免執行個體化類別,如下所示:

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

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

如需詳細資訊,請參閱私用建構函式 (C# 程式設計手冊)

結構型別的建構函式與類別建構函式類似,但是 structs 不能包含明確的預設建構函式,因為編譯器已經自動提供一個預設建構函式。這個建構函式會將 struct 中的每個欄位都初始化為預設值。如需詳細資訊,請參閱預設值表 (C# 參考)。不過,只有當 struct 是用 new 具現化時,才會叫用這個預設建構函式。例如,這段程式碼會使用 Int32 的預設建構函式,因此您可以確定整數已加以初始化:

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

然而下列程式碼會產生編譯器錯誤 CS0165,因為此段程式碼沒有使用 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);

因此不需要呼叫實值型別的預設建構函式。

類別和 structs 都可以定義使用參數的建構函式。必須透過 new 陳述式或基底陳述式來呼叫使用參數的建構函式。類別和 structs 也可以定義多個建構函式,而且都不必定義預設建構函式。例如:

public class Employee
{
    public int salary;

    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 (C# 參考)

在衍生類別 (Derived Class) 中,如果沒有使用 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;
}

建構函式可標示為 publicprivateprotectedinternal 或 protectedinternal。這些存取修飾詞 (Modifier) 將定義類別使用者如何建構類別。如需詳細資訊,請參閱存取修飾詞

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

C# 語言規格

如需詳細資料,請參閱 C# 語言規格中的下列章節:

  • 1.6.7.1 建構函式

  • 10.11 執行個體建構函式 (類別)

  • 11.3.8 建構函式 (結構)

  • 11.3.10 靜態建構函式 (結構)

請參閱

概念

C# 程式設計手冊

參考

類別和結構 (C# 程式設計手冊)

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

解構函式 (C# 程式設計手冊)