2014-10-05 199 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中運行。