有时,在一个类中有几个构造函数,以容纳某些可选参数,这些构造函数包含一些共同的代码。例如,如下情况:
Class Car
{private string _description;private int _nWheels;public Car(string description,unit nWheels){_description = description;_nWheels = nWheels;}public Car(string description){_description = description;_nWheels = 4;}//etc.
}
这两个构造函数初始化相同的字段,显然,最好把所有的代码放在一个地方。C#有一个特殊的语法,称为构造函数初始化器,可以实现此目的:
Class Car
{private string _description;private int _nWheelspublic Car(string description , int nWheels){_description = description;_nWheels = nWheels;}public Car(string description) : this(description ,4){}//etc.
}
这里,this关键字,仅调用参数最匹配的那个构造函数。注意,构造函数初始化器在构造函数的函数体之前执行。现在假定运行下面的代码:
var myCar = new Car("Proton Person");
在本例中,在带一个参数的构造函数的函数体执行之前,先执行带两个参数的构造函数(但是在本例中,因为再带一个参数的构造函数的函数体中没有代码,所以没有区别)。
C#构造函数初始化器可以包含对同一个类的另一个构造函数的调用(使用前面介绍的语法),也可以包含对直接基类的构造函数的调用(使用相同的语法,但是应使用base 关键字代替 this)。初始化器中不能有多个调用。