在寫程序的時候,往往會出現為一個類型提供不同場景的構造函數,可能大多構造函數比較相似,而C#中又不允許缺省參數,因此構造函數的編寫無疑是一個重復工作。但是使用Copy和Paste來完成構造函數的編寫,有時候很難達到統一,尤其是當成員發生變化的時候。因此比較常見的替換方法就是為構造函數提供一個統一的成員函數來完成初始化工作。
例如:
public class MyClass { private int _Age; private string _Name; public MyClass( string Name) { InitMember( Name, 20 ); } public MyClass( string Name, int Age ) { InitMember( Name, Age ); } /// <summary> /// Init class members /// </summary> /// <param name="Name"></param> /// <param name="Age"></param> private void InitMember( string Name, int Age ) { _Age = Age; _Name = Name; } }
不過,在C#中提供了更為簡明的方法,就是在構造函數初始化語句中調用另一構造函數,那麼上面的形式可以改寫為如下這樣。
public class MyClass { private int _Age; private string _Name; public MyClass( string Name):this( Name, 20 ) {} public MyClass( string Name, int Age ) { _Age = Age; _Name = Name; } }
對於這兩者來說,執行效率沒有太大差別,但從代碼質量而言,後者要好很多,而且會使代碼看起來更清晰。
其次,對於基類的調用。由於成員函數不能調用基類的構造函數,所以對於第一種編寫就比較困難,後者就簡單多了。
例如:
public class MyClass:BaseClass { private int _Age; private string _Name; public MyClass( string Name):this( Name, 20 ) {} public MyClass( string Name, int Age ):base( Name, Age ) { _Age = Age; _Name = Name; } }
這裡要提的一點就是構造函數初始化語句,對於“this”或者“base”之類的調用只能有一個,不能並存。
最後,就是對於readonly常量的初始化,由於readonly常量只能通過成員初始化語句或者在構造函數中被修改,因此在成員函數中無法修改readonly常量,這也是構造函數初始化語句要比成員函數好的重要一個因素。
有了上面的說明,對於兩者的對比,可以形成如下這個簡單的對比表。
效率 代碼結構 基類調用 靜態成員初始化 構造函數初始化語句 一樣 簡明清晰 容易 可以 成員函數 比較清晰 比較麻煩 不能(注:這裡不提倡Copy/Paste方法來重復編寫構造函數)