一つの小さい面の試験問題の細部の分析

3174 ワード

今日突然、以前に出会った問題を思い出しました.テーマは以下の通りです(ほとんどの人が出会ったことがあるかもしれません).
 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が親を呼び出す関数ではなく出力されます.何も出力されません.