C#構造函數 -0028
默認構造函數
聲明基本構造函數的語法就是聲明一個與類同名的方法,但該方法沒有返回類型:
public class MyClass { public MyClass() { } // rest of class definition }
如果沒有提供任何構造函數,編譯器會在後台生成一個默認的構造函數。默認的構造函數,只能把所有的成員欄位初始化為標準的默認值。
但是,如果定義了帶參數的構造函數,編譯器就不會自動提取默認的構造函數。
private或protected構造函數
可以把構造函數定義為private或Protected,這樣就限制不相關的類不能訪問它。
比如定義private,
public class MyNumber { private int _number; private MyNumber(int number) // another overload { _number = number; } }
在外部程式碼中,不能使用new關鍵字實例化MyNumber;但可以編寫一個公有靜態屬性或方法,以實例化該類,比如單例模式。
public class Singleton { private static Singleton _instance; private int _state; private Singleton(int state) => _state = state; public static Singleton Instance => _instance ?? (_instance = new Singleton(42)); }
構造函數中調用其他構造函數
class Car { private string _description; private uint _nWheels; public Car(string description, uint nWheels) { _description = description; _nWheels = nWheels; } public Car(string description): this(description, 4) { } // ... }
通過this關鍵字調用另一個構造函數,這種語法稱為構造函數初始化器。this關鍵字調用參數最匹配的那個構造函數。
注意,構造函數初始化器在構造函數的函數體之前執行。如:
var myCar = new Car("Proton Persona");
會先調用有兩個參數的構造函數,然後調用只有一個參數的構造函數。
靜態構造函數
C#可以給類定義無參數的靜態構造函數,這種構造函數只執行一次。
靜態構造函數只能訪問類的靜態成員,不能訪問類的實例成員。
靜態構造函數不能帶任何參數,一個類也只能有一個靜態構造函數。
在C#中,通常在第一次調用類的任何成員之前,執行靜態構造函數。
public enum Color { White, Red, Green, Blue, Black }
public static class UserPreferences { public static Color BackColor { get; } static UserPreferences() { DateTime now = DateTime.Now; if (now.DayOfWeek == DayOfWeek.Saturday || now.DayOfWeek == DayOfWeek.Sunday) { BackColor = Color.Green; } else { BackColor = Color.Red; } } }