建構函式用於初始化物件,分為靜態與實例兩類。若類別未定義任何建構函式,編譯器會自動提供一個無參數的預設建構函式,將所有欄位初始化為預設值 (數值型為 0、參考型為 null)。
public class A
{
public int Number;
public string Word;
}
public class Test
{
static void Main()
{
A a = new A(); // 呼叫預設建構函式
Console.WriteLine($"Number = {a.Number}"); // 0
Console.WriteLine($"Word = {a.Word}"); // (空字串)
}
}
若類別定義了任何帶參數的建構函式,編譯器**不再**自動產生無參數建構函式。此時若程式碼仍嘗試 new A(),將導致編譯錯誤。
Activator.CreateInstance(typeof(A)) 預設呼叫無參數建構函式。base(...)。new A { Number = 1 } 先呼叫無參數建構函式再設定屬性。public class A
{
public int Number;
public string Word;
// 顯式保留無參數建構函式
public A() { }
// 其他帶參數建構函式
public A(int number, string word)
{
Number = number;
Word = word;
}
}
結論:除非確定類別永遠不需被序列化、反射建立、繼承或使用物件初始化語法,否則**務必顯式宣告公用無參數建構函式**,避免未來維護引發難以追蹤的錯誤。