2014-10-05 153 views
1

我写了下面的代码,但是我对下面代码的输出有怀疑。为什么输出是yyxz?

首先疑问是,当我们初始化子类对象时,首先调用基类构造函数,所以OutPut只应该是xz。 Y类的构造函数不应该被调用。

第二疑问是Y被调用,那么订单应由yxyz。

请清除我的疑惑。

class X 
     { 
      Y y = new Y(); 
      public X() 
      { 

       Console.Write("x"); 
      } 
     } 

     class Y 
     { 
      public Y() 
      { 

       Console.Write("y"); 
      } 
     } 

     class Z: X 
     { 
      Y y = new Y(); 
      public Z() 
      { 

       Console.Write("z"); 
      } 
     } 
     public static void Main() 
     { 
      new Z(); 
     } 

回答

2

如果你看看this link on MSDN你将看到如何操作执行:

变量初始化转化为赋值语句,而这些赋值语句的基类构造函数的调用之前执行。这种排序确保所有实例字段都在执行任何有权访问该实例的语句之前由其变量初始化器初始化。

这意味着你的执行顺序是这样的:

  1. Y类构造函数被从等级Z它打印y
  2. Base类X构造函数被从等级Z称为调用,但它首先初始化变量类Y,它印刷另一y
  3. 基类X构造从等级Z它打印x
  4. 类Z构造被称为所谓的哪个PR ints z
1

很简单:字段初始值在构造函数之前被处理。在调用任一构造函数之前,您的行Y y = new Y();都在ZX中运行。