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

时间:2019-03-27 00:46:21

标签: c# static static-initialization

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

            public static class Foo
            {

                static string A = GetA(B);
                static string B = "required for A";
                ...

现在,我的理解是,AB在首次访问时将被初始化。但是,当我执行上述片段的完全实现的版本时,在初始化A之前访问B时,它导致null被传递给GetA()而不是"required for A"。为什么没有开始初始化A的行为,那么当意识到初始化B需要A,初始化B,然后返回以完成{{1}的初始化时}?

与此相关的一般规则是什么?为什么会这样呢?我看到了与此相关的其他问题(When do static variables get initialized in C#?),但他们并未完全回答这个问题。 What is the static variable initialization order in C#?主要讨论跨类的工作原理,而不是单个类中的工作(尽管乔恩·斯基特(Jon Skeet)对他的回答进行了补充-“按大众的需求,这是我最初的回答,问题是关于一个类中静态变量的初始化顺序:....”确实回答了这个问题,它埋在一个更长的答案中。)

1 个答案:

答案 0 :(得分:4)

简而言之,不要这样做。

Standard ECMA-334 C# Language Specification

  

15.5.6.2静态字段初始化

     

类的静态字段变量初始值设定项对应于   以文本顺序执行的分配顺序   它们出现在类声明中(第15.5.5.1节)。在一个   局部类,“文本顺序”的含义由   §15.5.6.1。如果类中存在静态构造函数(第15.12节),   静态字段初始化程序的执行紧接在   执行该静态构造函数。 否则,静态字段   初始化程序在与实现相关的时间执行,然后   该类的静态字段的首次使用

解决方法是:

  • 按顺序放置它们并使用 Static Constructor
  • 或者只是将它们初始化静态构造器中,从而使您能够控制初始化的顺序(根据上述信息)。

我个人建议将它们初始化为 Static Constructor ,这似乎使其更加具体和易于理解,并且不太可能在重构中遇到障碍

相关问题