共用方式為


使用建構函式 (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 關鍵詞,叫用相同物件中的另一個建構函式。 如同 basethis 可以搭配或不搭配參數使用,建構函式中的任何參數都可以用作 this的參數,或作為表達式的一部分。 例如,使用 this可以重寫上一個範例中的第二個建構函式:

public Employee(int weeklySalary, int numberOfWeeks)
    : this(weeklySalary * numberOfWeeks)
{
}

在上一個範例中使用 this 關鍵詞會導致呼叫下列建構函式:

public Employee(int annualSalary) => Salary = annualSalary;

建構函式可以標示為 publicprivateprotected內部內部受保護的private protected。 這些存取修飾詞會定義 類別的使用者如何建構 類別。 如需詳細資訊,請參閱 存取修飾子

建構函式可以使用 static 關鍵詞宣告為靜態。 在存取任何靜態字段之前,會自動呼叫靜態建構函式,並用來初始化靜態類別成員。 如需詳細資訊,請參閱 靜態建構函式

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格中的 實例建構函式靜態建構函式。 語言規格是 C# 語法和使用方式的最終來源。

另請參閱