我在c#
中有以下代码class Test
{
public static int X = Y;
public static int Y = 3;
}
static void Main()
{
Console.WriteLine(Test.X);
Console.WriteLine(Test.Y);
}
在这种情况下,我得到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);
}
为什么会这样?
答案 0 :(得分:16)
来自C# spec:
类的静态字段变量初始值设定项对应于以它们出现在类声明中的文本顺序执行的赋值序列。
因此,在您的第一个代码段中,由于Y
尚未初始化X
,X
必须默认为0
(因为default(int) == 0
)。另一方面,在您的第二个代码段中,Y
可以初始化为X
的值,因为X
已经被赋予了前一个3
的值言。
答案 1 :(得分:7)
这是根据规范,它说明了静态字段的初始化顺序。基本点是它们按声明的顺序初始化。
因此,在您的第一个代码段中,首先初始化X
,然后Y
。由于Y
尚未初始化,因此其默认值为0
,因此X
获取值0
。
在您的第二个代码段中,X
首先被初始化,但显式值为3
。然后,Y
被初始化,并且X
的值为3
,因为它首先被初始化。
来自§10.5.5.1静态字段初始化
类的静态字段变量初始值设定项对应于按照它们出现在类声明中的文本顺序执行的赋值序列。如果类中存在静态构造函数(第10.12节),则在执行该静态构造函数之前立即执行静态字段初始值设定项。
答案 2 :(得分:4)
极客 -
当你实例化一个int时,它的默认值是0.因此,当你运行:
public static int X = Y;
public static int Y = 3;
...当你将X设置为等于它时,Y为“0”,并且你将Y设置为3.但是当你运行时:
public static int X = 3;
public static int Y = X;
您将X设置为3,然后设置Y = X(现在为3)。
答案 3 :(得分:1)
字段按其声明的顺序初始化。在第一种情况下,使用Y值初始化X,但是Y尚未初始化,因此其值为0.在第二种情况下,使用X的值初始化Y,即3,因此两个字段都包含3。
答案 4 :(得分:1)
只是因为 X在Y 之前声明,并且在顺序中也是已初始化。所以默认情况下int为0 ,因此当Y未初始化时X为零。
答案 5 :(得分:1)
如果我错了(或低估我,w / e),请纠正我,但是在C#中,int是值类型。当您首先将X指定给Y的值时,Y值为0,它会复制值,而不是参考值。