注意變量初始化函數被轉換為賦值語句,並且那個賦值語句在對基類構造函數調用前執行。這個順序確保了所有實例域在任何訪問實例的語句執行前,被它們的變量初始化函數初始化。例如:
class A
{
public A() {
PrintFIElds();
}
public virtual void PrintFIElds() {}
}
class B: A
{
int x = 1;
int y;
public B() {
y = -1;
}
public override void PrintFIElds() {
Console.WriteLine("x = {0}, y = {1}", x, y);
}
}
當new B() 被用來創建B的實例時,產生下面的輸出:
x = 1, y = 0
因為變量初始化函數在基類構造函數被調用前執行,所以x的數值是1。可是,y的數值是0(int的默認數值),這是因為對y的賦值直到基類構造函數返回才被執行。
默認構造函數
如果一個類不包含任何構造函數聲明,就會自動提供一個默認的構造函數。默認的構造函數通常是下面的形式
public C(): base() {}
這裡C是類的名稱。默認構造函數完全調用直接基類的無參數構造函數。如果直接基類中沒有可訪問的無參數構造函數,就會發生錯誤。在例子中
class Message
{
object sender;
string text;
}
因為類不包含構造函數聲明,所以提供了一個默認構造函數。因此,這個例子正好等同於
class Message
{
object sender;
string text;
public Message(): base() {}
}
私有構造函數
當一個類只聲明了私有的構造函數時,其他類就不能從這個類派生或創建類的實例。私有構造函數通常用在只包含靜態成員的類中。例如:
public class Trig
{
private Trig() {} // Prevent instantiation
public const double PI = 3.14159265358979323846;
public static double Sin(double x) {...}
public static double Cos(double x) {...}
public static double Tan(double x) {...}
}
Trig 類提供了一組相關的方法和常數,但沒有被例示。因此,它聲明了一個單獨的私有構造函數。注意至少要必須聲明一個私有構造函數來避免自動生成默認的構造函數(它通常有公共的訪問性)。