建構函式 (C# 程式設計指南)
建構函式 是在建立 類別 或 結構 的實例時,執行時期所呼叫的方法。 類別或結構可以有多個採用不同自變數的建構函式。 建構函式可讓您確保類型實例在建立時有效。 如需詳細資訊和範例,請參閱使用建構函式 和
有數個動作是初始化新實例的一部分。 下列動作會依下列順序執行:
- 實體欄位設定為 0。 此初始化通常是由執行時完成。
- 欄位初始化器執行。 最衍生型別中的欄位初始化器會執行。
- 基底類型欄位初始化運算式執行。 初始化欄位從直接基底開始,經由每個基底類型到達 System.Object。
- 基底實例建構函式會執行。 任何實例建構函式,從 Object.Object 開始,經由每個基類到達直接基類。
- 實體建構函式會執行。 型別的實例建構函式會執行。
- 物件初始化器執行。 如果表達式包含任何物件初始化表達式,它們會在實例建構函式執行之後執行。 物件初始化表達式會以文字順序執行。
當使用 new
運算子建立實例時,會發生上述行動。 如果 struct
的新實例設為其 default
值,則所有實例字段都會設定為 0。 當建立陣列時,陣列的元素會設定為預設值0或 null
。
靜態建構函式(如果有的話)會在類別的任何實例開始進行實例建構之前執行。 靜態建構函式最多執行一次。
建構函式語法
建構函式是與其類別名稱相同的函式。 其方法簽章可以包含選擇性 存取修飾詞、方法名稱和其參數清單;它不包含傳回類型。 下列範例顯示名為 Person
類別的建構函式。
public class Person
{
private string last;
private string first;
public Person(string lastName, string firstName)
{
last = lastName;
first = firstName;
}
// Remaining implementation of Person class.
}
如果建構函式可以實作為單一語句,您可以使用 表示式主體成員。 下列範例定義了一個 Location
類別,其建構函式有一個名為 的單一字串參數。 表達式主體定義會將自變數指派給 [locationName
] 字段。
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
如果類型需要參數來建立實例,您可以使用 主要建構函式 來指出需要一或多個參數來具現化類型,如下列範例所示:
public class LabelledContainer<T>(string label)
{
public string Label { get; } = label;
public required T Contents
{
get;
init;
}
}
靜態建構函式
上述範例顯示實例建構函式,其會初始化新的物件。 類別或結構也可以宣告靜態建構函式,以初始化型別的靜態成員。 靜態建構函式是無參數的。 如果您未提供靜態建構函式來初始化靜態欄位,C# 編譯程式會將靜態字段初始化為其預設值,如 C# 類型的 預設值 一文所述。
下列範例會使用靜態建構函式來初始化靜態字段。
public class Adult : Person
{
private static int minimumAge;
public Adult(string lastName, string firstName) : base(lastName, firstName)
{ }
static Adult() => minimumAge = 18;
// Remaining implementation of Adult class.
}
您也可以使用表達式主體定義來定義靜態建構函式,如下列範例所示。
public class Child : Person
{
private static int maximumAge;
public Child(string lastName, string firstName) : base(lastName, firstName)
{ }
static Child() => maximumAge = 18;
// Remaining implementation of Child class.
}
如需詳細資訊和範例,請參閱 靜態建構函式。