共用方式為


建構函式 (C# 程式設計指南)

建構函式 是在建立 類別結構 的實例時,執行時期所呼叫的方法。 類別或結構可以有多個採用不同自變數的建構函式。 建構函式可讓您確保類型實例在建立時有效。 如需詳細資訊和範例,請參閱使用建構函式 和 實例建構函式

有數個動作是初始化新實例的一部分。 下列動作會依下列順序執行:

  1. 實體欄位設定為 0。 此初始化通常是由執行時完成。
  2. 欄位初始化器執行。 最衍生型別中的欄位初始化器會執行。
  3. 基底類型欄位初始化運算式執行。 初始化欄位從直接基底開始,經由每個基底類型到達 System.Object
  4. 基底實例建構函式會執行。 任何實例建構函式,從 Object.Object 開始,經由每個基類到達直接基類。
  5. 實體建構函式會執行。 型別的實例建構函式會執行。
  6. 物件初始化器執行。 如果表達式包含任何物件初始化表達式,它們會在實例建構函式執行之後執行。 物件初始化表達式會以文字順序執行。

當使用 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.
}

如需詳細資訊和範例,請參閱 靜態建構函式

另請參閱