使用建構函式 (C# 程式設計指南)
當具現化 類別 或 結構 時,運行時間會呼叫其建構函式。 建構函式的名稱與類別或結構相同,而且通常會初始化新對象的數據成員。
在下列範例中,名為 Taxi
的類別是使用簡單的建構函式來定義。 然後,這個類別會使用 new
運算符具現化。 運行時間會在為新物件配置記憶體之後,立即叫用 Taxi
建構函式。
public class Taxi
{
private string taxiTag;
public Taxi(string tag) => taxiTag = tag;
public override string ToString() => $"Taxi: {taxiTag}";
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi("Tag1345");
Console.WriteLine(t);
}
}
不接受任何參數的建構函式稱為 無參數建構函式。 當物件使用 new
運算符具現化,且未提供自變數給 new
時,運行時間會叫用無參數建構函式。 C# 12 引進 主要建構函式。 主要建構函式會指定必須提供以初始化新對象的參數。 如需詳細資訊,請參閱 實體建構函式。
除非類別 靜態,否則沒有建構函式的類別會由 C# 編譯程式提供公用無參數建構函式,以啟用類別具現化。 如需詳細資訊,請參閱 靜態類別和靜態類別成員。
您可以藉由將建構函式設為私用來防止類別具現化,如下所示:
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
如需詳細資訊,請參閱 私人建構函式。
結構 類型的建構函式類似類別建構函式。 當結構類型以 new
具現化時,運行時間會叫用建構函式。 當 struct
設為其 default
值時,運行時間會將結構中的所有記憶體初始化為 0。 如果您在 struct
類型中宣告任何字段初始化表達式,則必須提供無參數建構函式。 如需詳細資訊,請參閱
下列程式代碼會針對 Int32使用無參數建構函式,以確保整數已初始化:
int i = new int();
Console.WriteLine(i);
不過,下列程式代碼會造成編譯程式錯誤,因為它不使用 new
,而且因為它嘗試使用未初始化的物件:
int i;
Console.WriteLine(i);
或者,某些 struct
類型(包括所有內建數值類型)可以初始化或指派,然後如以下範例所示使用:
int a = 44; // Initialize the value type...
int b;
b = 33; // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);
類別和結構都可以定義採用參數的建構函式,包括 主要建構函式。 採用參數的建構函式必須透過 new
語句或 基底 語句呼叫。 類別和結構也可以定義多個建構函式,而且不需要定義無參數建構函式。 例如:
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
關鍵字明確呼叫基類建構子,則會隱含呼叫無參數建構子(如果存在)。 下列建構函式宣告實際上相同:
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
、內部、內部受保護的 或 private protected
。 這些存取修飾詞會定義 類別的使用者如何建構 類別。 如需詳細資訊,請參閱 存取修飾子。
建構函式可以使用 static
關鍵詞宣告為靜態。 在存取任何靜態字段之前,會自動呼叫靜態建構函式,並用來初始化靜態類別成員。 如需詳細資訊,請參閱 靜態建構函式。
C# 語言規格
如需詳細資訊,請參閱