所谓方法重载就是让同一个方法带有不同参数列表。构造函数是指在创建类的对象时必须执行的一系列操作,他也可以被重载,在创建类时可以根据实际参数情况合理调用一个构造函数。这里就有一个问题了:如果每一个构造函数都要执行一些特定的操作,那我们不得不在每一个构造函数里面粘贴执行这些特定操作的代码,这就造成了代码的重复。
解决办法是仅在缺省实例构造函数中放入这一段代码,让每个重载实例构造函数通过构造函数初始化器来调用它。
: this ([<形参列表>])
用法示例:
class Account
{
private decimal
balance;
private decimal
interestRate;
private string holderName;
public Account(decimal initialBalance, decimal
initialInterestRate, string initialHolderName)
{
balance =
initialBalance;
interestRate =
initialBalance;
holderName =
initialHolderName;
}
public Account(string
initialHolderName)
: this(0, 0,
initialHolderName)
{
Console.WriteLine("Only initial
holder name supplied.");
}
public
Account()
: this(0, 0, "Not
assigned yet.")
{
Console.WriteLine("Note: no
initial information supplied.");
}
}
上例中,Account类的构造函数被重载,无论调用哪一个重载实例构造函数,下面这一段代码总被执行:
public Account(decimal initialBalance, decimal initialInterestRate, string
initialHolderName)
{
balance =
initialBalance;
interestRate =
initialBalance;
holderName =
initialHolderName;
}
使用构造函数初始化器,其参数表达式有几点要注意:
构造函数初始化器必须位于它的实例构造函数形式参数作用域之内,如;
public Account(string
initialHolderName)
: this(0, 0,
initialHolderName)
是可行的,而下面
public Account(string
initialHolderName)
: this(0,
this.interestRate, initialHolderName)
无效,this引用了一个实例变量,但在这里,任何对实例变量的引用是无效的,而且在这里不能使用this关键字。
最后一点是,构造函数初始化器的参数列表不能与他所应用的实例构造函数的形式参数列表匹配,如下面的代码错误:
class test
{
...
public test(int initialValue) : this (10)
//无效,initialValue与10匹配
{...}
...
}
错误的根本原因在于形成了一个无限自身调用链。