執行個體建構函式 (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# 參考)。