5 ответов:
при первом обращении к классу.
Статические Конструкторы (Руководство По Программированию На C#)
статический конструктор используется для инициализации любых статических данных или для выполнения определенного действия, который должен выполняться только один раз. Он вызывается автоматически до создания первого экземпляра или ссылки на любые статические элементы.
Это не так просто, как можно было бы ожидать, несмотря на простую документацию. Статья Джона Скитаhttp://csharpindepth.com/Articles/General/Beforefieldinit.aspx подробно разбирается в этом вопросе.
резюме:
статический конструктор гарантированно будет выполнен тут перед первой ссылкой на член этого класса-либо создание экземпляра, либо собственный статический метод/свойство класса.
обратите внимание, что статические инициализаторы (если нет статического конструктора) гарантированно будут выполнены в любое время перед первой ссылкой на конкретное поле.
статический конструктор вызывается перед использованием чего-либо в классе, но точно, когда это произойдет, зависит от реализации.
он гарантированно будет вызван до того, как первый статический элемент будет доступен и до того, как будет создан первый экземпляр. Если класс никогда не используется, статический конструктор не гарантируется, что он будет вызван вообще.
в случае, если статический метод вызывается из родительского класса, статический конструктор вызываться не будет, хотя он явно указан. Вот пример B конструктор не вызывается, если вызывается b. methoda ().
static void Main(string[] args) { b.methoda(); } class a { public static void methoda() { //using initialized method data } } class b : a { static b() { //some initialization } }
там, кажется, есть gotcha со статическими конструкторами, которые отвечают в другом месте, но потребовалось некоторое время, чтобы переварить в простое объяснение. Все документы и объяснения утверждают, что статический конструктор / инициализаторы "гарантированно" выполняются до создания первого класса или ссылки на первое статическое поле. Gotcha приходит, когда вы пытаетесь поместить статический синглтон в класс, который создает экземпляр самого себя (курица/яйцо). В этом случае статический конструктор в конечном итоге вызывается после конструктора экземпляра - и в моем случае конструктор экземпляра содержал код, который полагался на некоторые статические данные.
статический конструктор вызывается после конструктора экземпляра?
статический конструктор может работать после non-статический конструктор. Это ошибка компилятора?
(ответ для меня состоял в том, чтобы поместить синглтон в отдельный класс или вручную инициализировать статические данные в конструкторе экземпляра, прежде чем это потребуется)
Comments