public class A
{
    public static int X;
    static A()
    {
        X = B.Y + 1;
    }
}
public class B
{
    public static int Y = A.X + 1;
    static B()
    { }
    static void Main()
    {
        Console.WriteLine("X={0},Y={1}", A.X, B.Y);
    }
}为什么结果是X=1,Y=2.
请高手指教原因!谢谢

解决方案 »

  1.   

    不是很明显吗?
    X = B.Y + 1;
    x=1.
    public static int Y = A.X + 1;
    X = B.Y + 1;
    y=2
      

  2.   

    B的构造函数为空,则Y被初始化为0;
    A的构造函数为X = B.Y + 1; 因此X=1;
    Y=2 因为int Y = A.X + 1;这条语句的的执行在B的构造函数执行完成后再执行?
      

  3.   

    你可以在VS中通过断点的方式来得到两个类的构建过程。首先
    public static int Y = A.X + 1;
    被执行。
    在执行的时候。会实例化A.在实例化A的时候B.Y还没有得到数值,所以为0.这个时候
    A.x = B.Y + 1;
    所以A.X = 0+1=1;
    这个时候 B.Y 继续执行。获得B.Y=1+1=2;
    然后Main()函数会执行。
    所以输出x=1,y=2
    建议你以后贴代码的时候使用代码格式,否则不好看懂啊
      

  4.   

    1.类的初始化顺序是静态字段初始化、调用静态初始化方法。
    现在Main方法是在类B中的,首先初始化静态成员Y为0,执行复制语句A.X+1时,对类A静态初始化
    X=0,然后是static A(),因为此时B.Y=0,所以X=0+1,结果是A.X=1;
    此时类B中的Y的复制语句就成了Y=1+1
    输出结果就是X=1,Y=22.你可以试试将Main方法拿出来,Console.WriteLine("X={0},Y={1}", A.X, B.Y);
    你会发现,此时A.X=2,B.Y=1了。因A.X的输出在前,静态初始化首先从A开始。3.再将输出语句改为Console.WriteLine("X={0},Y={1}", B.Y, A.X);
    即颠倒了它们的顺序,最后的情况为B.Y=2,A.X=1。
    这个说明此时类B的静态初始化在先。
      

  5.   

    static void Main()
    {
    Console.WriteLine("X={0},Y={1}", A.X, B.Y);
    }从这个地方开始看,就能理解的。
    调用A.X。静态的构造函数肯定会先执行,那么就是static A()
    {
    X = B.Y + 1;
    }
    x不就是1了。
    剩下的b.y。B类开始执行的时候,先执行静态构造函数,然后是就静态字段。
    public static int Y = A.X + 1;
    A.X已经是1了。+1。B.Y就等于2了
      

  6.   


    .class public auto ansi B
        extends [mscorlib]System.Object
    {
        .method private hidebysig specialname rtspecialname static void .cctor() cil managed
        {
            .maxstack 8
            L_0000: ldsfld int32 ConsoleApplication2.A::X
            L_0005: ldc.i4.1 
            L_0006: add 
            L_0007: stsfld int32 ConsoleApplication2.B::Y
            L_000c: nop 
            L_000d: nop 
            L_000e: ret 
        }    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed
        {
            .maxstack 8
            L_0000: ldarg.0 
            L_0001: call instance void [mscorlib]System.Object::.ctor()
            L_0006: ret 
        }    .method private hidebysig static void Main() cil managed
        {
            .entrypoint
            .maxstack 8
            L_0000: nop 
            L_0001: ldstr "X={0},Y={1}"
            L_0006: ldsfld int32 ConsoleApplication2.A::X
            L_000b: box int32
            L_0010: ldsfld int32 ConsoleApplication2.B::Y
            L_0015: box int32
            L_001a: call void [mscorlib]System.Console::WriteLine(string, object, object)
            L_001f: nop 
            L_0020: call string [mscorlib]System.Console::ReadLine()
            L_0025: pop 
            L_0026: ret 
        }
        .field public static int32 Y}.class public auto ansi A
        extends [mscorlib]System.Object
    {
        .method private hidebysig specialname rtspecialname static void .cctor() cil managed
        {
            .maxstack 8
            L_0000: nop 
            L_0001: ldsfld int32 ConsoleApplication2.B::Y
            L_0006: ldc.i4.1 
            L_0007: add 
            L_0008: stsfld int32 ConsoleApplication2.A::X
            L_000d: ret 
        }    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed
        {
            .maxstack 8
            L_0000: ldarg.0 
            L_0001: call instance void [mscorlib]System.Object::.ctor()
            L_0006: ret 
        }
        .field public static int32 X}