先来看一个经典题目:
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);
}
}
问的是输出的结果是什么,也就是Main()里面 A.X, B.Y的值
这个题目的答案是 1,2
为什么呢?
因为执行的时候,首先从
程序的入口点(就是Main())找起,因为Main在类B中,所以从B类开始加载。执行顺序大致是这样的:
(用到一个类的时候是先对其静态变量初始化,然后调用他的静态构造函数)
(类的静态构造函数只在加载类的时候由系统调用一次且只此一次)
1.初始化B类的
静态变量 Y,系统先给他一个
默认值(此处是
0),然后再执行他的初始化
赋值语句public static int Y =
A.X + 1;
2.执行这条语句的时候因为用到了A.X,所以遇到A的时候去
加载类A,顺序一样,先是执行A的
静态变量X的初始化工作public static int X;因为没有对其赋值的操作,所以X就是系统给他的
默认值0;然后调用A的
静态构造函数(B那里也是先初始化静态变量,然后才调用静态构造函数,因为B初始化静态变量的时候用到了A所以才会跳到A来,不然的话B那边也是初始化静态变量之后系统紧接着就会调用B的静态构造函数);
3,A的静态构造函数中执行X =
B.Y + 1;可以知道,此时B.Y已经有了一个系统给他的默认值0,所以此处就是X=0+1;现在X就是1了
4,X那边都完工了,回到刚才跳转X的地方继续执行,就是
继续执行Y = A.X + 1;毫无疑问此时是Y=1+1;至此,
B的静态变量初始化完成了。
5,B的静态变量初始化完成了那紧接着就是系统调用
B的静态构造函数,此处什么也不执行。
6.输出结果1,2
总结一下:
1、这种东西总归就是执行的时候,Main在哪个类里面就先初始化哪个类(如果Main在外边,比如Main不在A,B中,那么看Main先用到谁就先初始化谁);
2、然后初始化的时候,在加载类的时候是先初始化类的静态变量,然后接着执行类的静态构造函数(静态构造函数是加载类的时候系统调用的,只执行这一次。);
3、初始化静态变量的时候,系统先给他赋上默认值,然后才执行类中定义的赋值语句,比如public static int
Z = 3;实际上是先是Z=0;然后Z=3;
4、初始化完了静态变量之后紧接着调用此类的静态构造函数(上面的那个例子也是按照这个顺序的,有人可能问为什么上面那个例子B静态变量初始化的时候有跳转,其实那也是完全按照顺序执行,因为B顺序是现初始化静态变量,然后静态构造函数。可是B静态变量初始化的时候用到了A,那A就也是静态变量-构造函数,然后回到B静态变量初始化的语句继续执行,B静态变量初始化完了才紧接着B静态构造函数。)
5、看看下面几个例子,全都做对了就说明你掌握了
using System;
class A
{
public static int X;
static A()
{
X = B.Y + 1;
}
static void Main(string[] args)
{
Console.WriteLine("A.X:{0}tB.Y:{1}", A.X, B.Y);
Console.Read();
}
}
class B
{
public static int Y = A.X + 1;
static B();
{
}
}
上面这个例子的结果是什么呢???
他的执行顺序应该是
1、public static int X;
2、static A(){X = B.Y + 1;}
3、public static int Y = A.X + 1;
4、static B();
没错,结果就是 2,1
再看下面的一个
using System;
class A
{
public static int X;
static A()
{
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B();
{
}
}
class C
{
static void Main(string[] args)
{
Console.WriteLine("A.X:{0}tB.Y:{1}", A.X, B.Y);
Console.Read();
}
}
结果是什么呢?
他的执行顺序应该是
1、public static int X;
2、static A(){X = B.Y + 1;}
3、public static int Y = A.X + 1;
4、static B();
没错,结果还是 2,1,因为先用到的A后用到的B嘛!
o(∩_∩)o...哈哈,都明白了吧
<由于个人能力有限,如有错误请指正,谢谢>