C# 为什么静态变量在C中声明之前就可以使用#
我能够成功编译并运行以下程序:C# 为什么静态变量在C中声明之前就可以使用#,c#,static-variables,C#,Static Variables,我能够成功编译并运行以下程序: class MyClass1 { public static int x = y; public static int y = 10; } static void Main(string[] args) { Console.WriteLine(MyClass1.x); //prints 0 Console.WriteLine(MyClass1.y); //prints 10 } 为什么编译成功?在声明和初始化之前,x如何获取y的
class MyClass1
{
public static int x = y;
public static int y = 10;
}
static void Main(string[] args)
{
Console.WriteLine(MyClass1.x); //prints 0
Console.WriteLine(MyClass1.y); //prints 10
}
为什么编译成功?在声明和初始化之前,
x
如何获取y
的值?如果实例字段出现同样的gets编译时错误。它们是按顺序初始化的。第一个x
设置为y
的值,该值为0(默认值)。然后将y
设置为10。它们按顺序初始化。第一个x
设置为y
的值,该值为0(默认值)。然后将ECMA-334-17.4.5.1静态字段初始化中的y
设置为10。
类声明的静态字段变量初始值设定项
对应于在中执行的赋值序列
它们在类声明中出现的文本顺序。如果
静态构造函数(§17.11)存在于类中,执行
静态字段初始值设定项在执行之前立即发生
静态构造函数否则,静态字段初始值设定项为
在第一次使用之前的依赖于实现的时间执行
该类的静态字段
因此,在
x
变量的初始化行中使用y
变量,并使用ECMA-334-17.4.5.1静态字段初始化中的默认值0
进行初始化
类声明的静态字段变量初始值设定项
对应于在中执行的赋值序列
它们在类声明中出现的文本顺序。如果
静态构造函数(§17.11)存在于类中,执行
静态字段初始值设定项在执行之前立即发生
静态构造函数否则,静态字段初始值设定项为
在第一次使用之前的依赖于实现的时间执行
该类的静态字段
因此,在
x
变量的初始化行中使用y
变量,并使用默认值0
定义“before”进行初始化。由于它们是静态的,MyClass1不需要实例化就可以使用x和y,所以在这种情况下,“before”只能在您将它们添加到类之前出现。我不太明白您的意思。我知道x和y都是静态场。当我们第一次尝试访问某个类型的任何静态字段或静态方法(本例中为x)时,通过静态构造函数对静态字段进行初始化。当它发生时,我相信当x被初始化时y应该是可用的,但在下一行发现y是有问题的。定义“before”。由于它们是静态的,MyClass1不需要实例化就可以使用x和y,所以在这种情况下,“before”只能在您将它们添加到类之前出现。我不太明白您的意思。我知道x和y都是静态场。当我们第一次尝试访问某个类型的任何静态字段或静态方法(本例中为x)时,通过静态构造函数对静态字段进行初始化。当它发生时,我相信当x被初始化时y应该是可用的,但在下一行发现y是有问题的。