C#是否自动解决静态数据成员之间的依赖关系?

Mor*_*eng 9 c# static data-members

如果一个静态数据成员依赖于另一个静态数据成员,C#/ .NET是否保证依赖成员之前初始化依赖的静态成员?

例如,我们有一个类,如:

class Foo
{
    public static string a = "abc";

    public static string b = Foo.a + "def";
}
Run Code Online (Sandbox Code Playgroud)

当访问Foo.b时,它总是"abcdef"还是"def"?

如果不能保证,有没有更好的方法来确保首先初始化depen成员?

Bry*_*ard 9

如前所述,静态字段初始化是确定性的,并根据文本声明顺序进行.

以此为例,例如:

class Foo
{
    public static string b = a + "def";
    public static string a = "abc";
}
Run Code Online (Sandbox Code Playgroud)

Foo.b将始终导致"def".

就此而言,当静态字段之间存在依赖关系时,最好使用静态初始化程序:

class Foo
{
    public static string b;
    public static string a;

    static Foo()
    {
        a = "abc";
        b = a + "def";
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您就明确表达了对初始化顺序的关注; 或者依赖于这个问题(即使编译器在你不小心交换初始化语句时也无济于事.)上面的预期值将存储在a和b中(分别为"abc"和"abcdef").

但是,对于在多个类中定义的静态字段的初始化,事情可能会变得曲折(并且特定于实现).第10.4.5.1节语言规范的静态字段初始化更多地讨论了它.