一道小小面試題的細節分析
今天突然想到以前遇到的一個問題,題目如下(可能絕大多數人都遇到過):
1 class A 2 { 3 public A() 4 { 5 PrintFields(); 6 } 7 public virtual void PrintFields() { } 8 } 9 class B : A 10 { 11 int x = 1; 12 int y; 13 public B() 14 { 15 y = -1; 16 } 17 public override void PrintFields() 18 { 19 Console.WriteLine("x={0},y={1}", x, y); 20 } 21 }
問題:實例化類B時輸出什么結果 B b = new B();
答案:x=1, y=0
?
知識點:
- 類的實例化過程
- base類與this類的關系
?
在類的實例化過程中(不談靜態變量)涉及到 構造函數中的賦值, 字段的直接賦值
通過IL Disassembler我們可以看到 構造實體類的過程, 執行順序為
- 直接賦值的字段
- 父類構造函數
- 子類構造函數
因此對于知識點1可以解釋在B實例化的時候 x=1, y=0
?
另一個知識點就是this與base之間的關系, ?理解上我們可以任務 base = this; 因此在用base調用虛擬函數的時候會調用子類的方法 ;)
因此在構造B實例是會輸出x=1,y=0 而不是 調用父類的函數什么都不輸出
posted on 2012-04-18 13:35 一顆鹵蛋 閱讀(...) 評論(...) 編輯 收藏