如果一个静态数据成员取决于另一个静态数据成员,则c#/。净保证依赖静态成员在依赖成员之前初始化?

例如,我们有一个类似:

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”,因为初始化在源头上排名第一,就像以前一样。

所有静态成员将在持有它们的ClasStype加载后初始化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top