Когда вызывается статический конструктор в C #? - PullRequest
78 голосов
/ 17 сентября 2009

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

Ответы [ 5 ]

84 голосов
/ 17 сентября 2009

При первом обращении к классу.

Статические конструкторы (Руководство по программированию в C #)

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

36 голосов
/ 17 сентября 2009

Это не так просто, как вы могли бы ожидать, несмотря на простую документацию. Статья Джона Скита http://csharpindepth.com/Articles/General/Beforefieldinit.aspx подробно описывает этот вопрос.

Резюме:

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

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

18 голосов
/ 17 сентября 2009

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

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

1 голос
/ 26 февраля 2016

В случае, если статический метод вызывается из родительского класса, статический конструктор не будет вызываться, хотя он явно указан. Вот пример, конструктор 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
    }
}    
0 голосов
/ 28 июля 2018

Кажется, есть недочет со статическими конструкторами, на который есть ответы в другом месте, но потребовалось время, чтобы разобраться в простом объяснении. Во всех документах и ​​пояснениях утверждается, что статический конструктор / инициализаторы «гарантированно» будет запущен до создания первого класса или ссылки на первое статическое поле. Гоча появляется, когда вы пытаетесь поместить статический синглтон в класс, который создает свой экземпляр (курица / яйцо). В этом случае статический конструктор вызывается после конструктора экземпляра - и в моем случае конструктор экземпляра содержал код, который полагался на некоторые статические данные.

Статический конструктор, вызываемый после конструктора экземпляра?

Статический конструктор может запускаться после нестатического конструктора. Это ошибка компилятора?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...