执行顺序问题
using System.Collections.Generic;
using System.Text;
namespace StaticDemo
{
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()
{
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
Console.ReadKey();
}
}
}
程序执行顺序:
输出A.X的值,调用static A() 给X赋值 在赋值的过程中用到B.Y调用static B()获得B.Y的值.X=2;
输出B.Y的值,构造函数为空,而且给了初始值Y=1;
问题:请问编译后执行,输出结果是多少?
答案是:X=2,Y=1
解释(来自于网上):
1.其实关于静态构造函数的题目,以前也见过,主要是考察静态构造函数和构造函数执行先后顺序的理解。这道题目倒是别出心裁,升级成了两个类型的静态构造函数和静态成员初始化执行先后顺序。
我们都知道静态成员初始化和静态构造函数编译后都是静态构造函数的一部分,而静态构造函数在类型被加载时执行,这道题目的头疼之处在于,并不是很明显能看出到底是A类加载在前还是B类加载在前。如果A类加载在前,则执行A类的静态构造函数的时候,必然会加载B类型,换言之在B.Y
+ 1这个表达式有结果前,B类型必须被加载,所以Y = 0(X默认为零) + 1 = 1,X = 1(Y被初始化) + 1 =
2。如果B类初始化在前,则结果恰恰相反。最后我认为A类将加载在前,结果应该是X=2,Y=1。但实际上心里并没底。——Ivony(出自:这里)
2.Main方法是程序的入口,Console.WriteLine( "X={0},Y={1}", A.X,
B.Y
);中先访问的是A.X,因为X是静态的成员所以在访问X之前A的静态构造函数必定已经执行完成,A的静态构造函数中又访问了B.X,同理在A的静态构造函数中获得B.Y的值之前B的静态构造函数必定已经执行完成,由于在完成A的静态构造函数中X=B.Y
+
1的中途中执行流程跳到了B的静态构造函数,所以此时A.X还是默认值0,接着在B的静态构造函数被执行完成后得以在A的静态函数中成功获得B.Y,此时B.Y=A.X
+
1=0+1=1,接着A.X=1+1=2
所以输出的是X=2,Y=1
我有次面试也遇到这个题目,我给出个结果后面自己注释了个“//不肯定”因为脑子被搞乱了,面试官看了答的结果后问我为什么,因为我可能是蒙对了,我承认了输出结果我是蒙的,但是我用自己知道的关于静态方法的知识回答了他问的为什么的问题,我用了正确的执行流程在大脑中执行了这个过程,但是由于当时很紧张并不能肯定自己执行出的结果。
——Xuefly(出自这里)