Когда статический конструктор называется в С#?

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

Ответ 1

Когда класс открывается в первый раз.

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

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

Ответ 2

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

Резюме:

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Кажется, есть gotcha со статическими конструкторами, которые отвечают в другом месте, но потребовалось некоторое время, чтобы переварить простое объяснение. Все документы и объяснения утверждают, что статический конструктор /intializers "гарантирован" должен выполняться до того, как будет создан экземпляр первого класса или будет упомянуто первое статическое поле. Когда вы пытаетесь поместить статический синглтон в класс, который создает экземпляр самого себя (курица/яйцо), вы получаете его. В этом случае статический конструктор заканчивается вызовом после конструктора экземпляра, и в моем случае конструктор экземпляра содержал код, который опирался на некоторые статические данные.

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

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

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