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