一つの小さい面の試験問題の細部の分析
3174 ワード
今日突然、以前に出会った問題を思い出しました.テーマは以下の通りです(ほとんどの人が出会ったことがあるかもしれません).
質問:クラス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が親を呼び出す関数ではなく出力されます.何も出力されません.
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
知識点:
クラスのインスタンス化中(静的変数を除く)は、コンストラクション関数の割り当て、フィールドの直接割り当てに関連します.
IL Disassemblerでは、実行順序が
もう一つの知識点はthisとbaseの関係であり、base=thisをタスクできることを理解することです.したがってbaseで仮想関数を呼び出すとサブクラスのメソッドが呼び出されます.)
したがって、構築Bインスタンスではx=1、y=0が親を呼び出す関数ではなく出力されます.何も出力されません.