Max*_*ich 6 .net c# c++ initialization initialization-order
在我研究在C#中构建Singleton的最佳方法的过程中,我偶然发现了以下文章,其中简要提及在C++中
"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
Run Code Online (Sandbox Code Playgroud)
"因为静态构造函数执行时的规则(如第10.11节所定义)规定B的静态构造函数(以及因此B的静态字段初始化程序)必须在A的静态构造函数和字段初始化程序之前运行."
但令我感到困惑的是,我的理解是这些示例中静态变量的初始化顺序将基于何时首次调用类中的方法或字段,而后者又基于代码块的执行顺序(这种情况从左到右).IE:完全独立于类声明的位置或顺序.然而,根据我对该文章的解释,它说这是由于这些类的声明顺序,我的测试没有备份?
有人可以请我澄清一下(以及文章试图提出的观点)并且可能提供一个更好的例子来说明所描述的行为吗?
类的静态字段变量初始值设定项对应于以它们出现在类声明中的文本顺序执行的赋值序列.
这意味着在同一个类中,静态字段按源代码中的外观顺序初始化.例如:
class A
{
public static int X = Test.F("Init A.X");
public static int Y = Test.F("Init A.Y");
}
Run Code Online (Sandbox Code Playgroud)
当初始化静态字段时,X保证在之前初始化Y.
"因为静态构造函数执行时的规则(如第10.11节所定义)规定B的静态构造函数(以及因此B的静态字段初始化程序)必须在A的静态构造函数和字段初始化程序之前运行."
这意味着当访问这些类的表达式出现时,每个类的静态构造函数和成员初始化将按评估顺序运行.源代码中类定义的出现的相对顺序不起任何作用,即使它们出现在同一个源文件中(他们肯定没有义务这样做).例如:
static void Main() {
Console.WriteLine("{0} {1}", B.Y, A.X);
}
Run Code Online (Sandbox Code Playgroud)
假设既A没有B也没有静态初始化,评估顺序保证所有字段都B将在任何字段之前初始化A.每个类的字段将按第一个规则指定的顺序初始化.
¹出于本讨论的目的,我忽略了存在beforefieldinit.
| 归档时间: |
|
| 查看次数: |
1564 次 |
| 最近记录: |