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

с учетом следующего кода:

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

   private static Int32 myCharsSize = myChars.Length;
}

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

Ответ 1

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

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

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

Ответ 2

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


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

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

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

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

Ответ 3

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

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