Console.WriteLine(Foo.X);
Console.WriteLine(Foo.Y);
class Foo{
public static int X = Y;
public static int Y = 5;
}
为啥结果是:
0
5
我猜测是这样的:
如果没有定义一个静态构造函数,编译后会自动生成一个静态构造函数,这个函数里,先给X赋值Y(Y这个时候还是0),然后Y赋值5.
得先读到Y,才能执行Y=5
有什么问题吗,代码从上到下依次执行。
Console.WriteLine(Foo.X); 时 Y 还未赋值,当前是默认值咯
反编译初始化代码如下 :
IL_0000: ldsfld int32 Hmiot_Primitive.Wpf.Foo::Y //加载Y
IL_0005: stsfld int32 Hmiot_Primitive.Wpf.Foo::X //设置X
IL_000a: ldc.i4.5 //加载5
IL_000b: stsfld int32 Hmiot_Primitive.Wpf.Foo::Y //设置Y
so,没有什么为什么,这是别个ms编译器规则,如果编译器是自己的,那么可以按照自己的规则执行,当然jit和cpu还必须得听话。
变量的初始值考虑进去就行了