Порядок инициализации статического члена в одном классе C # - PullRequest
3 голосов
/ 27 марта 2019

Рассмотрим следующий фрагмент класса с двумя статическими переменными-членами:

            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, а затем возврата для завершения инициализации A?

Каковы общие правила вокруг этого?Почему так себя ведет?Я видел другие вопросы, которые касаются этого ( Когда статические переменные инициализируются в C #? ), но они не отвечают на этот вопрос точно. Каков порядок инициализации статической переменной в C #? говорит в первую очередь о том, как это работает в классах, а не в одном классе (хотя в добавлении Джона Скита к его ответу - «По многочисленным просьбам», вот мой первоначальный ответ, когда я подумал, что вопрос касается порядка инициализации статических переменных в классе: .... "действительно отвечает на этот вопрос, он похоронен в гораздо более длинном ответе).

1 Ответ

4 голосов
/ 27 марта 2019

Короче, не делай этого.

Стандартная спецификация языка ECMA-334 C #

15.5.6.2 Инициализация статического поля

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

Исправление:

  • Поместите их в порядок и используйте Статический конструктор ,
  • или просто Инициализируйте их в Статический конструктор по очереди, даваяУ вас есть возможность контролировать порядок инициализации (учитывая приведенную выше информацию).

Лично я предлагаю Инициализировать их в Статический конструктор , кажетсячтобы сделать его более конкретным и понятным и с меньшей вероятностью столкнуться с рефакторингом

...