最近准备去面试一个实习工作,看了一下<C#入门经典(第三版)>,看到那个构造函数的执行序列(原书176页)就动手试了一下,结果发现了一个问题
以下摘自书中
考虑下面的对象结构
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class MyBaseClass
{
public MyBaseClass()
{
}
public MyBaseClass(int i)
{
}
}
public class MyDerivedClass:MyBaseClass
{
public MyDerivedClass(){}
public MyDerivedClass(int i)
{
}
public MyDerivedClass(int i,int j)
{
}
}
如果以下面的方式实例化MyDerivedClass
MyDerivedClass myObj=new MyDerivedClass();
则事件的顺序如下
1.执行System.Object.Object()构造函数;
2.执行MyBaseClass.MyBaseClass()构造函数;
3.执行MyDerivedClass.MyDerivedClass()构造函数;
如果以下面的方式实例化MyDerivedClass
MyDerivedClass myObj=new MyDerivedClass(4);
则事件的顺序如下
1.执行System.Object.Object()构造函数;
2.执行MyBaseClass.MyBaseClass(int i)构造函数;
3.执行MyDerivedClass.MyDerivedClass(int i)构造函数;
如果以下面的方式实例化MyDerivedClass
MyDerivedClass myObj=new MyDerivedClass(4,8);
则事件的顺序如下
1.执行System.Object.Object()构造函数;
2.执行MyBaseClass.MyBaseClass()构造函数;
3.执行MyDerivedClass.MyDerivedClass(int i, int j)构造函数;
注意上面的红色部分,为什么会这样执行呢,我自己做了一下实验,发现不是这样执行的
事件的顺序如下
1.执行System.Object.Object()构造函数;
2.执行MyBaseClass.MyBaseClass()构造函数;
3.执行MyDerivedClass.MyDerivedClass(int i)构造函数;
看看我的代码(用vs2008,为了排除是不是由于.net 3.5的原因,我特意换vs05又试了一遍)
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
class Program
{
static void Main(string[] args)
{
MainClass m1 = new MainClass();
Console.WriteLine();
MainClass m2 = new MainClass(1);
Console.WriteLine();
MainClass m3 = new MainClass(1, 3);
Console.ReadLine();
}
}
public class Base
{
public Base()
{
Console.WriteLine("执行Base类的无参数构造函数");
}
public Base(int i)
{
Console.WriteLine("执行Base类的一个int参数的构造函数");
}
}
public class MainClass : Base
{
public MainClass() { }
public MainClass(int i)
{
Console.WriteLine("执行一个参数int构造函数");
}
public MainClass(int i, int j)
{
Console.WriteLine("执行两个int参数");
}
}
执行结果截图
看来应该是书上的印刷错误了,莫非还有什么其他的原因?
PS:顺便再记一下可以改变实例化执行的构造函数的两个关键字,base,this,用法也很简单,就在构造函数方法签名后面加":base(int i)"这样类似的语句,就会去执行它父类中有相同签名的构造函数.