Как сказано выше, инициализация статического поля является детерминированной и происходит в соответствии с порядком текстовой декларации.
Возьмите это, например:
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 Инициализация статического поля спецификации языка еще немного об этом говорит.