Порядок инициализации статических полей в статическом классе

учитывая следующий код:

public static class Helpers
{
   private static Char[] myChars = new Char[] {'a', 'b'};

   private static Int32 myCharsSize = myChars.Length;
}

гарантируется ли это myChars будет инициализирован до Я использую его длину, чтобы назначить myCharsSize?

3 ответов


Да, они будут, пожалуйста, см. 10.4.5.1 инициализация статического поля:

инициализаторы переменных статического поля класса соответствуют последовательности назначения, выполняемые в текстовом порядке, в котором они появляются в объявление класса. если статический конструктор (раздел 10.11) существует в класс, выполнение статического инициализаторы полей происходят немедленно перед выполнением статических конструктор. В противном случае, статический инициализаторы полей выполняются в зависящее от осуществления время до первое использование статического поля этот класс.

при этом я думаю, что было бы лучше сделать инициализацию внутри инициализатора статического типа (статического конструктора).


Мда... Я удивлен, что компилирует (это так, я проверил). Я не знаю никаких гарантий, что это безопасно. Используйте статический конструктор...


Edit: я принимаю (см. лучше ответь выше), что он будет работать; но моя идея с кода, чтобы держать его как можно более простым и понятным. Если это не так очевидно что это сработает (и этого не может быть, если вам нужно спросить), тогда не пишите так...

в частности, проблемы с опираясь на порядок полей:

  • он может сломаться, если вы перемещаете код вокруг (что я часто делаю)
  • он может сломаться, если вы разделите код на partial классы

мой совет остается: используйте статический конструктор для этого сценария.


на первый взгляд, я не был бы уверен, и я должен был попробовать это, чтобы увидеть, если он даже не компилируется.

учитывая это, я бы инициализировал значение в статическом конструкторе.