例如:
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方法來重復編寫構造函數)