c#中的静态字段初始值设定项

san*_*ngh 9 c#

我在c#中有以下代码

class Test
{
  public static int X = Y;    
  public static int Y = 3;    
}

static void Main()
{
Console.WriteLine(Test.X);
Console.WriteLine(Test.Y);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到0和3,但在下面的情况下,我得到3,3

class Test
{
  public static int X = 3;    
  public static int Y = X;    
}

static void Main()
{
Console.WriteLine(Test.X);
Console.WriteLine(Test.Y);
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Bol*_*ock 16

来自C#规范:

类的静态字段变量初始值设定项对应于以它们出现在类声明中的文本顺序执行的赋值序列.

因此,在您的第一个片段中,由于Y尚未初始化X,X因此必须默认为0(因为default(int) == 0).另一方面,在你的第二个片段中,Y可以初始化为的值X因为X已经3在前一个语句中给出了一个值.


jas*_*son 7

这是按规范说明的,它说明了静态字段的初始化顺序.基本点是它们按声明的顺序初始化.

因此,在您的第一个代码段中,X首先进行初始化然后再进行初始化Y.由于Y尚未初始化,它具有默认值,0因此X获取值0.

在您的第二个片段中,X首先进行初始化,但是给出了显式值3.然后,Y被初始化并给予的值X这是3因为它是首次初始化.

从§10.5.5.1静态字段初始化

类的静态字段变量初始值设定项对应于以它们出现在类声明中的文本顺序执行的赋值序列.如果类中存在静态构造函数(第10.12节),则在执行该静态构造函数之前立即执行静态字段初始值设定项.