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.
请高手指教原因!谢谢
{
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.
请高手指教原因!谢谢
X = B.Y + 1;
x=1.
public static int Y = A.X + 1;
X = B.Y + 1;
y=2
A的构造函数为X = B.Y + 1; 因此X=1;
Y=2 因为int Y = A.X + 1;这条语句的的执行在B的构造函数执行完成后再执行?
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
建议你以后贴代码的时候使用代码格式,否则不好看懂啊
现在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的静态初始化在先。
{
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了
.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}