使用建構函式 (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;
}
建構函式可標示為 public、private、protected、internal 或 protectedinternal。這些存取修飾詞 (Modifier) 將定義類別使用者如何建構類別。如需詳細資訊,請參閱存取修飾詞。
建構函式可使用 static 關鍵字宣告為靜態。靜態建構函式會在即將存取任何靜態欄位之前自動進行呼叫,而靜態建構函式通常是用來初始化靜態類別成員。如需詳細資訊,請參閱靜態建構函式。
C# 語言規格
如需詳細資料,請參閱 C# 語言規格中的下列章節:
1.6.7.1 建構函式
10.11 執行個體建構函式 (類別)
11.3.8 建構函式 (結構)
11.3.10 靜態建構函式 (結構)