在我研究在 C# 中构建单例的最佳方法期间,我偶然发现了以下文章,其中简要提到了 C++
“C++ 规范在静态变量的初始化顺序上留下了一些歧义。”
我最终调查了这个问题,发现了 this和this。基本上重点(据我所知)是 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 的静态构造函数和字段初始值设定项之前运行。”
但是我感到困惑的是,我的理解是这些示例中静态变量的初始化顺序将基于第一次调用类中的方法或字段的时间,而这又基于代码块的执行顺序(本例从左到右)。IE:完全独立于类声明的位置或顺序。然而,根据我对那篇文章的解释,它说它是这些类的声明顺序的结果,我的测试没有支持?
有人可以为我澄清这一点(以及这篇文章试图提出的观点),或许可以提供一个更好的例子来说明所描述的行为?