在研究如何在C#中构建单例模式的最佳方法时,我偶然发现了这篇文章,其中简要提到在C++中存在以下问题:
"由于静态构造函数执行的规则(在第10.11节中定义),B的静态构造函数(以及B的静态字段初始化程序)必须在A的静态构造函数和字段初始化程序之前运行。" 但是我困惑的是,我的理解是,这些示例中静态变量的初始化顺序将基于首次调用类中方法或字段的时间,这又取决于代码块的执行顺序(本例从左到右)。换句话说:完全独立于类声明的位置或顺序。然而,根据我对该文章的解释,它说这是由于这些类的声明顺序,而我的测试并不支持这一点?请问有人能为我澄清这一点(以及文章试图表达的观点),并提供更好的例子来说明所描述的行为吗?"
于是我查看了此处和此处。基本上(就我所理解的)是指C++中静态变量的初始化顺序是未定义的。好吧,我想到这里应该还算顺利,但接下来我想弄明白文章后面提到的这个陈述。"C++规范在静态变量初始化顺序方面留下了一些模棱两可的地方。"
于是我找到了这个页面,他们在其中提到:"幸运的是,.NET Framework通过其处理变量初始化的方式解决了这种不确定性。"
并给出以下示例:类的静态字段变量初始化器对应于按它们在类声明中出现的文本顺序执行的一系列赋值。
using System;
class Test
{
static void Main() {
Console.WriteLine("{0} {1}", B.Y, A.X);
}
public static int F(string s) {
Console.WriteLine(s);
return 1;
}
}
class A
{
static A() {}
public static int X = Test.F("Init A");
}
class B
{
static B() {}
public static int Y = Test.F("Init B");
}
the output must be:
Init B
Init A
1 1
"由于静态构造函数执行的规则(在第10.11节中定义),B的静态构造函数(以及B的静态字段初始化程序)必须在A的静态构造函数和字段初始化程序之前运行。" 但是我困惑的是,我的理解是,这些示例中静态变量的初始化顺序将基于首次调用类中方法或字段的时间,这又取决于代码块的执行顺序(本例从左到右)。换句话说:完全独立于类声明的位置或顺序。然而,根据我对该文章的解释,它说这是由于这些类的声明顺序,而我的测试并不支持这一点?请问有人能为我澄清这一点(以及文章试图表达的观点),并提供更好的例子来说明所描述的行为吗?"