单个 C# 类中的静态成员初始化顺序

Ada*_*dam 4 c# static static-initialization

考虑以下带有两个静态成员变量的类片段:

            public static class Foo
            {

                static string A = GetA(B);
                static string B = "required for A";
                ...
Run Code Online (Sandbox Code Playgroud)

现在,我的理解是,AB会在第一次访问时初始化。然而,当我执行上面代码片段的完全实现版本(在初始化A之前访问过的代码片段)时,它导致被传递到而不是. 为什么行为不是开始初始化A,然后,当它意识到需要初始化时,初始化,然后返回以完成初始化?BnullGetA()"required for A"BABA

这方面的一般规则是什么?为什么它会这样?我见过其他涉及此问题的问题(When do static Variables get initialized in C#?),但它们没有准确回答这个问题。C#中静态变量初始化顺序是什么?主要讨论它是如何类工作的,而不是在单个类中工作(尽管乔恩·斯基特对他的答案进行了补充——“根据大众的要求,当我认为问题是关于类中静态变量的初始化顺序时,这是我最初的答案:....”确实回答了这个问题,它被隐藏在一个更长的答案中)。

AAA*_*ddd 5

简而言之,不要这样做。

\n\n

标准 ECMA-334 C# 语言规范

\n\n
\n

15.5.6.2 静态字段初始化

\n\n

类的静态字段变量初始值设定项对应于按它们出现在类声明 (\xc2\xa715.5.6.1) 中的文本顺序执行的赋值序列。在分部类中,“文本顺序”的含义由\n \xc2\xa715.5.6.1 指定。如果类中存在静态构造函数 (\xc2\xa715.12),则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,静态字段初始值设定项将在首次使用该类的静态字段之前的依赖于实现的时间执行

\n
\n\n

解决办法是:

\n\n
    \n
  • 将它们按顺序排列并使用静态构造函数
  • \n
  • 或者只是在静态构造函数中依次初始化它们,使您能够控制初始化的顺序(鉴于上述信息)。
  • \n
\n\n

就我个人而言,我建议在静态构造函数中初始化它们,这似乎使其更加具体和易于理解,并且在重构中不太可能被碰撞

\n