当类第一次被加载时,会对类中的静态变量先按顺序进行分配内存空间,当全部分配完内存空间之后,再对静态变量按顺序赋值。
int x = y;
int y = 5;
程序会报错,因为x找不到y的值(y在栈中的值)
int x = y;
static int y = 5;
static void Main()
{
Console.WriteLine(x);
Console.WriteLine(y);
}
/*
Output:
5
5
*/
此时,先为static的y分配内存空间,然后赋值y为5,然后才对非static的x分配内存并赋值y的5,所以x是5,y是5
需要注意的,是下面这段代码
class Test
{
static int x = y;
static int y = 5;
static void Main()
{
Console.WriteLine(Test.x);
Console.WriteLine(Test.y);
Test.x = 99;
Console.WriteLine(Test.x);
}
}
/*
Output:
0
5
99
*/
先找到尚未声明的y,但是x是static,所以x使用默认值0
这里 x 是 static 变量,在类 Program 第一次被加载时,要先为 Program 里面所有的 static 变量分配内存。尽管现在有超线程技术,但是指令在逻辑上还是逐条的按顺序自上而下执行,所以 先为 static int x 分配内存,并且在该内存中保持int的缺省值0,接着再为 static int y 变量分配内存,值当然也为0。
然后第二步,为变量赋值:先为 static int x 变量赋值,x=y这个时候 y 的值是 0 ,于是 x=0 然后对变量y赋值,y=1;这行代码执行后,y就为1了。所以,y=1。
所以最后的结果为:
x=0 y=1