写构造函数是一个反复的工作。很多开发人员都是先写一个构造函数,然后 复制粘贴到其它的构造函数里,以此来满足类的一些重载接口。希望你不是这样 做的,如果是的,就此停止吧。有经验的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;
}
}