0

静的コンストラクターはここでどのように動作していますか?

class a
{    
    public static int x;
    static a()
    {
        x = b.y + 1;    
    }
}

class b    
{    
    public static int y = a.x + 1;

    static b()
    { 

    }

    static void Main(String[] args)
    {
       Console.WriteLine("x={0} , y={1} ", a.x, b.y);
        Console.ReadLine();    
    }
}

出力::

x=1、y=2

どのように ?

4

5 に答える 5

7

これは、ケースを除いて、ここに示されている正確な例であり、次の説明が得られます。

Main メソッドを実行するために、システムは、クラス B の静的コンストラクターの前に、まず BY の初期化子を実行します。AX の値が参照されるため、Y の初期化子によって A の静的コンストラクターが実行されます。次に、A の静的コンストラクターは X の値の計算に進み、その際に Y の既定値であるゼロをフェッチします。したがって、AX は 1 に初期化されます。その後、A の静的フィールド初期化子と静的コンストラクターを実行するプロセスが完了し、Y の初期値の計算に戻り、その結果は 2 になります。

于 2012-09-20T14:34:37.213 に答える
4

すべてはこの一行から始まる

public static int y = a.x + 1;

  • それは行くa.x
  • 入力後apublic static int x;初期化済み、静的

    static a()
    {
        x = b.y + 1;    
    }
    

ctor が呼び出されました。

  • このctorb.yはすでに静的に初期化されているため、b.y 現在の値を取得します。0

そうx = 0 + 1

  • に戻った後public static int y = a.x + 1;

はどこa.xですか?1int y = 1 + 1;

于 2012-09-20T14:34:06.873 に答える
0

b.yはデフォルト値の 0 から始まることに注意してください。したがって、 の値を設定すると、ya.x1 になります。

于 2012-09-20T14:34:15.193 に答える
0
  1. b.y初期化され、a初期化されるため、
  2. a()が呼び出され、(はまだデフォルトの 0 に初期化されています) に設定a.xされますb.y + 1b.y
  3. b.yに設定されますa.x + 1(a.xは 1 に初期化されています)

ただし、実際のコードではこれを避けます...

于 2012-09-20T14:31:10.203 に答える
0

C#仕様より

Main メソッドを実行するために、システムは、クラス B の静的コンストラクターの前に、まず BY の初期化子を実行します。AX の値が参照されるため、Y の初期化子によって A の静的コンストラクターが実行されます。次に、A の静的コンストラクターは X の値の計算に進み、その際に Y の既定値であるゼロをフェッチします。したがって、AX は 1 に初期化されます。その後、A の静的フィールド初期化子と静的コンストラクターを実行するプロセスが完了し、Y の初期値の計算に戻り、その結果は 2 になります。

この線

x = b.y + 1;

として実行されます

x = 0 +1; 

現時点では by の値を評価することができず、by の値はデフォルト値 (0) であるためです。

その後、プログラムはステートメントの評価を続けます

y = a.x + 1;

上記のステートメントで ax に 1 の値が割り当てられたため、上記は次のようになります。

y = 1 + 1;

最終的に結果はそれでx == 1あり、y == 2

于 2012-09-20T14:37:46.053 に答える