寫構造函數是一個反復的工作。很多開發人員都是先寫一個構造函數,然後 復制粘貼到其它的構造函數裡,以此來滿足類的一些重載接口。希望你不是這樣 做的,如果是的,就此停止吧。有經驗的C++程序可能會用一個輔助的私有方法 ,把常用的算法放在裡面來構造對象。也請停止吧。當你發現多重構造函數包含 相同的邏輯時,取而代之的是把這些邏輯放在一個常用的構造函數裡。你可以得 避免代碼的重復的好處,並且構造函數初始化比對象的其它代碼執行起來更高效 。C#編譯器把構造函數的初始化識別為特殊的語法,並且移除預置方法中重復的 變量和重復的基類構造函數。結果就是這樣的,你的對象最終執行最少的代碼來 合理的初始化對象。你同樣可以寫最少的代碼來把負責委托給一個常用的構造函 數。構造函數的預置方法充許一個構造函數調用另一個構造函數。這是一個簡單 的例子:
public class MyClass
{
// collection of data
private ArrayList _coll;
// Name of the instance:
private string _name;
public MyClass() :
this( 0, "" )
{
}
public MyClass( int initialCount ) :
this( initialCount, "" )
{
}
public MyClass( int initialCount, string name )
{
_coll = ( initialCount > 0 ) ?
new ArrayList( initialCount ) :
new ArrayList();
_name = name;
}
}
C#不支持帶默認值的參數,C++是很好 的解決這個問題的(譯注:C++可以讓參數有默認的值,從而有效的減少函數的重 載)。你必須重寫每一個特殊的構造函數。對於這樣的構造函數,就意味著大量 的代碼重復工作。可以使用構造函數鏈來取代常規的方法。下面就是一些常規的 低效率的構造函數邏輯:
public class MyClass
{
// collection of data
private ArrayList _coll;
// Name of the instance:
private string _name;
public MyClass ()
{
commonConstructor( 0, "" );
}
public MyClass( int initialCount )
{
commonConstructor( initialCount, "" );
}
public MyClass( int initialCount, string Name )
{
commonConstructor( initialCount, Name );
}
private void commonConstructor( int count,
string name )
{
_coll = (count > 0 ) ?
new ArrayList(count) :
new ArrayList();
_name = name;
}
}