共用方式為


執行個體建構函式 (C# 程式設計手冊)

當您使用 new 運算式建立的 class 的物件時,執行個體建構函式會用於建立並且初始化任一執行個體成員變數。 若要初始化 static 類別或是非靜態類別中的靜態變數,必須定義靜態建構函式。 如需詳細資訊,請參閱靜態建構函式 (C# 程式設計手冊)

下列範例顯示執行個體建構函式:

class CoOrds
{
    public int x, y;

    // constructor
    public CoOrds()
    {
        x = 0;
        y = 0;
    }
}
注意事項注意事項

為了避免困擾,這個類別會包含公用欄位。 在撰寫程式碼的實際應用時,並不建議使用公用欄位,因為它允許程式中的任何方法以無限制和未經驗證的方式,存取物件內部的運作方法。 資料成員通常應該是私用的,並且只能經由類別方法和屬性存取。

當建立以 CoOrds 類別為基礎的物件時就會呼叫這個執行個體建構函式。 像這樣不使用引數的建構函式稱為「預設建構函式」(Default Constructor)。 然而,通常提供其他建構函式會很有用。 例如,您可以將建構函式加入 CoOrds 類別以允許指定資料成員的初始值:

// tcA constructor with two arguments:
public CoOrds(int x, int y)
{
    this.x = x;
    this.y = y;
}

這可以讓要建立的 CoOrd 物件使用預設或特定初始值,如下所示:

CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);

如果類別沒有任何的建構函式,則會自動產生預設建構函式,而預設值會用於初始化欄位。 例如,int 初始化為 0。 如需預設值的詳細資訊,請參閱預設值表 (C# 參考)。 因此,由於 CoOrds 類別預設建構函式會將所有的資料成員初始化為零,所以能夠在不改變類別運作方式的情況下全部移除。 本主題稍後的「範例 1」會提供使用多個建構函式的完整範例,在「範例 2」中則會提供自動產生之建構函式的範例。

執行個體建構函式也可以用來呼叫基底類別的執行個體建構函式。 類別建構函式可透過初始設定式叫用基底類別的建構函式,例如:

class Circle : Shape
{
    public Circle(double radius)
        : base(radius, 0)
    {
    }
}

在這個範例中,Circle 類別會將代表半徑和高度的值傳遞至 Shape (Circle 就是由此衍生) 提供的建構函式。 本主題中的「範例 3」會示範使用 Shape 和 Circle 的完整範例。

範例 1

下列範例示範具有兩個類別建構函式的類別,其中一個沒有引數,另一個有兩個引數。

class CoOrds
{
    public int x, y;

    // Default constructor:
    public CoOrds()
    {
        x = 0;
        y = 0;
    }

    // tcA constructor with two arguments:
    public CoOrds(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    // Override the ToString method:
    public override string ToString()
    {
        return (String.Format("({0},{1})", x, y));
    }
}

class MainClass
{
    static void Main()
    {
        CoOrds p1 = new CoOrds();
        CoOrds p2 = new CoOrds(5, 3);

        // Display the results using the overriden ToString method:
        Console.WriteLine("CoOrds #1 at {0}", p1);
        Console.WriteLine("CoOrds #2 at {0}", p2);
        Console.ReadKey();
    }
}
/* Output:
 CoOrds #1 at (0,0)
 CoOrds #2 at (5,3)        
*/

範例 2

在這個範例中,Person 類別不具有任何的建構函式,在該情形中,會自動提供預設的建構函式並且將欄位初始化為預設值。

public class Person
{
    public int age;
    public string name;
}

class TestPerson
{
    static void Main()
    {
        Person person = new Person();

        Console.WriteLine("Name: {0}, Age: {1}", person.name, person.age);
        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output:  Name: , Age: 0

請注意,age 的預設值為 0,name 的預設值為 null。 如需預設值的詳細資訊,請參閱預設值表 (C# 參考)

範例 3

下列範例示範使用基底類別初始設定式。 Circle 類別衍生自一般類別 Shape,Cylinder 類別衍生自 Circle 類別。 每一個衍生類別上的建構函式使用其基底類別初始設定式。

abstract class Shape
{
    public const double pi = Math.PI;
    protected double x, y;

    public Shape(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    public abstract double Area();
}

class Circle : Shape
{
    public Circle(double radius)
        : base(radius, 0)
    {
    }
    public override double Area()
    {
        return pi * x * x;
    }
}

class Cylinder : Circle
{
    public Cylinder(double radius, double height)
        : base(radius)
    {
        y = height;
    }

    public override double Area()
    {
        return (2 * base.Area()) + (2 * pi * x * y);
    }
}

class TestShapes
{
    static void Main()
    {
        double radius = 2.5;
        double height = 3.0;

        Circle ring = new Circle(radius);
        Cylinder tube = new Cylinder(radius, height);

        Console.WriteLine("Area of the circle = {0:F2}", ring.Area());
        Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Area of the circle = 19.63
    Area of the cylinder = 86.39
*/

如需叫用基底類別建構函式的更多範例,請參閱 virtual (C# 參考)override (C# 參考)base (C# 參考)

請參閱

參考

類別和結構 (C# 程式設計手冊)

建構函式 (C# 程式設計手冊)

解構函式 (C# 程式設計手冊)

static (C# 參考)

概念

C# 程式設計手冊