在下面的代码中,如果我们使用常量字段,结果就可以了!但是当我们使用静态字段时,结果是不可预期的。
为什么以及如何?
class Program
{
private static int x = y + 100;
private static int y = z - 10;
private static int z = 300;
public static void Main(string[] args)
{
System.Console.WriteLine("{0}/{1}/{2}",x,y,z); // 100/-10/300 why and how?
Console.ReadKey();
}
}
答案 0 :(得分:8)
成员变量按照它们在文件中出现的顺序进行初始化。在初始化x时,y和z都是0。
答案 1 :(得分:2)
z还没有被初始化。更改您正在初始化变量的顺序。
class Program
{
private static int z = 300;
private static int y = z - 10;
private static int x = y + 100;
public static void Main(string[] args)
{
System.Console.WriteLine("{0}/{1}/{2}",x,y,z);
Console.ReadKey();
}
}
答案
390/290/300
答案 2 :(得分:2)
在编译时完全评估常量表达式(参见C#规范的第7.19节)。
由于允许常量表达式引用类的const
成员,因此const
成员的值在编译时计算。这就是为什么你得到正确的"使用const
字段的结果。
将此与static
字段进行比较,这些字段在运行时按照它们声明的顺序进行评估。