欄位初始化器會在基底類別建構函式呼叫之前執行,確保所有實例欄位在任何存取實例的語句執行前完成初始化:
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() 輸出:x = 1, y = 0
// 原因:x 初始化器在 base() 前執行;y 賦值在 base() 後執行,故仍為預設值 0
類別無任何建構函式宣告時,編譯器自動提供:
public C() : base() { } // C 為類別名稱
若基底類別無可存取的無參數建構函式則報錯。等同於:
class Message
{
object sender;
string text;
// 隱含 public Message() : base() { }
}
僅宣告私有建構函式可防止外部實例化與繼承,常用於純靜態工具類別:
public class Trig
{
private Trig() { } // 防止實例化
public const double PI = 3.14159265358979323846;
public static double Sin(double x) { ... }
public static double Cos(double x) { ... }
public static double Tan(double x) { ... }
}
至少需宣告一個私有建構函式,否則編譯器仍會產生公用預設建構函式。