考虑以下带有两个静态成员变量的类片段:
public static class Foo
{
static string A = GetA(B);
static string B = "required for A";
...
现在,我的理解是,A
和B
在首次访问时将被初始化。但是,当我执行上述片段的完全实现的版本时,在初始化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)对他的回答进行了补充-“按大众的需求,这是我最初的回答,问题是关于一个类中静态变量的初始化顺序:....”确实回答了这个问题,它埋在一个更长的答案中。)
答案 0 :(得分:4)
简而言之,不要这样做。
Standard ECMA-334 C# Language Specification
15.5.6.2静态字段初始化
类的静态字段变量初始值设定项对应于 以文本顺序执行的分配顺序 它们出现在类声明中(第15.5.5.1节)。在一个 局部类,“文本顺序”的含义由 §15.5.6.1。如果类中存在静态构造函数(第15.12节), 静态字段初始化程序的执行紧接在 执行该静态构造函数。 否则,静态字段 初始化程序在与实现相关的时间执行,然后 该类的静态字段的首次使用
解决方法是:
我个人建议将它们初始化为 Static Constructor ,这似乎使其更加具体和易于理解,并且不太可能在重构中遇到障碍