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()
{
Console.WriteLine("X={0},Y={1}",A.x,B.Y);
Console.Read();
}
}
{
public static int x;
static A()
{
x = B.Y + 1;
}
}class B
{
public static int Y = A.x + 1;
static B()
{ }
static void Main()
{
Console.WriteLine("X={0},Y={1}",A.x,B.Y);
Console.Read();
}
}
然后执行静态构造函数代码,x= 1+ 1; 注意 静态构造函数代码只执行一次。
最后结果x =2,y=1 楼主说的答案也写反了。
(原因a的构造函数点用B,而B构造函数里是空的,y默认为0,所以x=1,y=0);
B.Y=1+1;
y=2;
看程序猜得~
先执行public static int Y = A.x + 1;
因为有A.x所以会调用
static A()
{
x = B.Y + 1;
}
而调用A()时,Y的值还没有计算出来,所以此时B.Y=0,从而得出x=1
然后回到public static int Y = A.x + 1得出Y=2
class A
{
public static int x;
A()
{
x = B.Y + 1;
}
} class B
{
public static int Y = A.x + 1;
B()
{ }
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.x, B.Y);
Console.Read();
}
}
结果x=0,y=1
因为此时,并没有调用A,B的构造函数,只是用到了定义而已
class A
{
public static int x;//具有初始值0
static A()
{
x = B.Y + 1;
}
}class B
{
public static int Y;//具有初始值0
static B()
{
Y = A.x + 1;
}
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.x, B.Y);
Console.Read();
}
}main函数在B里面,所以编译器首先是初始化B
首先是字段Y,Y是int型,编译器初始化为0 ,然后Y为static,所以编译器接着执行B的静态构造函数,注意一点,构造函数只执行一次
在static B()里面,Y被赋值为A.X+1,编译器接着去找A.X的值,此时执行A的静态构造函数,x=B.Y+1,因为B的构造函数已经执行了,此时就不执行第二次,Y此时具有
值是0,所以X=1;然后返回Y=A.X+1,Y=2
所以答案就是X=1;Y=2;注意两点就可以了:初始化顺序是先字段后构造函数,每个字段都有一个初始的默认值
静态变量是在编译的时候就开始赋值的,而不是当进入到main函数当中才有值。
静态构造函数也是在main函数调用之前执行且与基构造函数不同,静态构造函数执行且执行一次,上边的例子,比如你写一句A a= new A();这段代码是不会调用static A() { x = B.Y + 1; } 这段代码的,你可以自己试验。
当静态构造函数的内容执行完后,才开始执行main函数, Console.WriteLine("X={0},Y={1}", A.x, B.Y); 这句仅仅是调用静态变量的值,根本就涉及不到构造函数的问题。
public static int Y = A.x + 1; //注意 Y=0,没有执行赋值操作
static A() //此时调用A的构造函数
{
x = B.Y + 1;
}
public static int Y = A.x + 1; //赋值操作
static B()
{ }
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.x, B.Y);
Console.Read();
}
static class Program
{
public static int Y = A.x + 1;
static Program()
{
MessageBox.Show("B的构造函数");
}
static void Main()
{
MessageBox.Show("x= " + A.x + ",y=" + Program.Y);
}
} class A
{
public static int x;
static A()
{
MessageBox.Show("x的值 =" +x.ToString());
x = Program.Y + 1;
MessageBox.Show("Y的值 = "+Program.Y.ToString());
MessageBox.Show("构造结束X ="+x.ToString());
}
}此时结果输出为:
x的值 = 0
Y的值 = 0
构造结束X = 1
B的构造函数
x= 1,y=2但是当如下面写的时候
static class Program
{
//public static int Y = A.x + 1;
public static int Y = 1;
static Program()
{
MessageBox.Show("B的构造函数");
}
static void Main()
{
MessageBox.Show("x= " + A.x + ",y=" + Program.Y);
}
} class A
{
public static int x;
static A()
{
MessageBox.Show("x的值 =" +x.ToString());
x = Program.Y + 1;
MessageBox.Show("Y的值 = "+Program.Y.ToString());
MessageBox.Show("构造结束X ="+x.ToString());
}
}输出的结果为:
B的构造函数
x值 = 0
Y的值 = 1
构造结束X = 2
x=2,y=1由此可看出,调用顺序是这样的,数值型的静态变量初始化都先为0,然后才开始计算,先初始化main函数所在的静态变量和静态构造函数,后初始化其他类中的静态变量和静态构造函数。不过在main函数所在类静态变量初始化过程中遇到了其他类中的静态变量,会先对使用到的静态变量和静态函数做初始化。
流程就是 先初始化y = a.x +1;因为遇到了a.x 所以转入到 A类,计算A.x的值,此时B.y的值因为还没有计算所以仍然为0,计算结束后,继续执行调用B的静态构造函数。