使用建構函式 (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;
}
建構函式可以標記為 public、private、protected、internal、protected internal 或 private protected。 這些存取修飾詞定義類別使用者如何建構類別。 如需詳細資訊,請參閱存取修飾詞。
建構函式可使用 static 關鍵字宣告為靜態。 靜態建構函式會在即將存取任何靜態欄位之前自動進行呼叫,而且會用來初始化靜態類別成員。 如需詳細資訊,請參閱靜態建構函式。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格的執行個體建構函式和靜態建構函式。 語言規格是 C# 語法及用法的限定來源。