C#中的构造函数是用来初始化类中的成员变量的特殊方法。在类继承中,派生类会继承基类的构造函数,同时也可以自定义自己的构造函数。
构造函数在派生类的实例化过程中,会按照一定的规则执行基类和派生类中的构造函数,其执行顺序如下:
- 先执行基类的构造函数。
- 继续执行派生类的构造函数。
这个顺序是由 C# 引入的可靠构造函数(Reliable Constructor)原则所决定的。
需要注意的是,如果派生类并没有指定调用哪个基类的构造函数,那么 C# 编译器会默认调用基类中无参的默认构造函数。
接下来,我们通过两个示例进一步说明。
示例1:
class BaseClass
{
public BaseClass()
{
Console.WriteLine("BaseClass Constructor");
}
}
class DerivedClass : BaseClass
{
public DerivedClass()
{
Console.WriteLine("DerivedClass Constructor");
}
}
在这个示例中,我们定义了一个基类BaseClass
和一个派生类DerivedClass
。从构造函数的定义可以看出,基类和派生类均只定义了一个无参的构造函数。
在派生类DerivedClass
的实例化过程中,会先执行基类BaseClass
的构造函数,再执行派生类DerivedClass
的构造函数。因此,当我们执行下面的代码时:
DerivedClass obj = new DerivedClass();
输出结果会是:
BaseClass Constructor
DerivedClass Constructor
这证明了基类构造函数在派生类构造函数之前被调用的规则。
示例2:
class BaseClass
{
public BaseClass(int num)
{
Console.WriteLine("BaseClass Constructor " + num);
}
}
class DerivedClass : BaseClass
{
public DerivedClass() : base(123)
{
Console.WriteLine("DerivedClass Constructor");
}
}
在这个示例中,我们在基类BaseClass
的构造函数中引入了一个参数num
,派生类DerivedClass
的构造函数在调用基类构造函数时,传入了参数123
。
在派生类DerivedClass
的实例化过程中,会先执行基类BaseClass
的构造函数,再执行派生类DerivedClass
的构造函数。但这一次,基类的构造函数是通过base()
语句在派生类中显式地调用的,而且还传递了一个参数。因此,当我们执行下面的代码时:
DerivedClass obj = new DerivedClass();
输出结果会是:
BaseClass Constructor 123
DerivedClass Constructor
这证明了我们在派生类中通过base()
显式调用基类构造函数时,可以传递参数给基类构造函数。
综上所述,对于 C# 中的构造函数在基类和父类中的执行顺序,我们须要注意两点:
- 构造函数执行顺序是先基类,后派生类。
- 如果没有指定调用基类的哪个构造函数,编译器会默认调用基类中的无参默认构造函数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#构造函数在基类和父类中的执行顺序 - Python技术站