【发布时间】:2012-07-09 09:50:38
【问题描述】:
在我研究在 C# 中构建单例的最佳方法期间,我偶然发现了以下 article,其中简要提到了 C++
“C++ 规范在初始化方面留下了一些歧义 静态变量的顺序。”
我最终调查了这个问题并找到了this 和this。基本上重点(据我所知)是 C++ 中静态变量的初始化顺序是未定义的。好吧我想到目前为止还不错,但是后来我想理解这篇文章稍后做出的以下陈述
“幸运的是,.NET Framework 通过它的 变量初始化的处理。”
所以我找到了this他们说的页面
类的静态字段变量初始化器对应于 以文本顺序执行的任务序列 它们出现在类声明中。
并举个例子
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:完全独立于类声明的位置或顺序。然而,根据我对那篇文章的解释,它说它是这些类的声明顺序的结果,我的测试没有支持?
有人可以为我澄清这一点(以及文章试图说明的观点),或许可以提供一个更好的例子来说明所描述的行为?
【问题讨论】:
标签: c# c++ .net initialization initialization-order