如果一个静态数据成员依赖于另一个静态数据成员,C#/.NET 是否保证依赖的静态成员在依赖成员之前初始化?
例如,我们有一个类:
class Foo
{
public static string a = "abc";
public static string b = Foo.a + "def";
}
当访问Foo.b时,它总是“abcdef”还是可以是“def”?
如果这不能保证,有没有更好的方法来确保依赖的成员首先初始化?
如果一个静态数据成员依赖于另一个静态数据成员,C#/.NET 是否保证依赖的静态成员在依赖成员之前初始化?
例如,我们有一个类:
class Foo
{
public static string a = "abc";
public static string b = Foo.a + "def";
}
当访问Foo.b时,它总是“abcdef”还是可以是“def”?
如果这不能保证,有没有更好的方法来确保依赖的成员首先初始化?
如前所述,静态字段初始化是确定性的,并根据文本声明顺序进行。
以这个为例:
class Foo
{
public static string b = a + "def";
public static string a = "abc";
}
Foo.b 将始终导致“def”。
就此而言,当静态字段之间存在依赖关系时,最好使用静态初始化器:
class Foo
{
public static string b;
public static string a;
static Foo()
{
a = "abc";
b = a + "def";
}
}
这样,您就明确表达了您对初始化顺序的关注;或依赖关系(即使编译器在您不小心交换初始化语句时也无济于事。)上面的预期值将存储在 a 和 b 中(分别为“abc”和“abcdef”)。
但是,对于在多个类中定义的静态字段的初始化,事情可能会变得曲折(并且特定于实现)。语言规范的10.4.5.1 静态字段初始化部分对此进行了更多讨论。
它将始终显示“abcdef”,因为初始化在源代码中自上而下进行,今天就像以前一样。
所有静态成员都将在加载持有它们的类类型时被初始化。